数据库MySQL,Mongodb,Redis及Zookeeper集群搭建文档
- 为什么要用集群
为什么我们要用集群?
首先是集群的高可用性:
构建集群的一个最大亮点和优点就是集群都具有高可用性,可以提供不间断性服务,从而保证了业务的持续运行,当服务出现故障时,集群系统可以自动的将服务从故障节点切换到备用节点。对于一些要求实时服务很强的应用系统,必须保证服务的24小时不间断运行,而由于其他人为或者不可预知的原因,单一的设备运行环境很难提供这种服务要求,所以构建集群系统是不可或缺的选择。
其次是集群的可扩展性:
集群的可扩展性体现在随时能够满足用户的需求,随着业务量的加大,现有的集群服务实体不能满足需求时,可以向此集群中动态的加入一个或多个服务节点,增强集群的整体性能。这就是集群可扩展性的体现。
最后就是集群的负载均衡
通过灵活、有效的系统分担负载,结合集群量身定制的负载分担策略,将客户端的访问合理的分配到各个服务节点,从而有效的利用资源,实现负载均衡
- 准备工作
准备3台机器组建一个小集群环境。它们的IP地址分别为10.105.44.118, 10.105.4.175和10.105.99.60. 将它们的host分别命名为db1,db2和db3。
服务器:DB1,DB2,DB3
系统:Centos 6.5 x64
安装包版本:
MySQL:mysql-5.6.26.tar.gz
Mongodb:mongodb-linux-x86_64-rhel62-3.0.3
Redis:redis-3.2.1.tar
Zookeeper:zookeeper-3.4.6.tar
三、安装集群
1、Zookeeper集群安装
注:先在DB1、DB2、DB3上分别执行(1)-(3)步,配置Java环境。
1、安装Zookeeper需要先装JDK,去Oracle的官网下载jdk。
2、解压安装包
tar –zxf jdk-7u79-linux-x64.tar.gz –C /usr/local
cd /usr/local
ln –sv jdk1.7.0_79/ jdk
[root ~]# vi /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:JAVA_HOME/bin
[root ~]# chmod 755 /etc/profile.d/jdk.sh
[root ~]# . /etc/profile.d/jdk.sh
3、查看是否安装成功
[root ~]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
[root ~]#
4、安装zookeeper(先在DB1上执行)
(1)解压:这里以unilife作为用户名进行安装,将zookeeper-3.4.6.tar.gz解压到/home/unilife目录下。
#tar -zxvf zookeeper-3.4.6.tar.gz
#mv zookeeper-3.4.6 zookeeper-cluster/
(2)配置:将conf/zoo_sample.cfg拷贝一份命名为zoo.cfg,也放在conf目录下。然后按照如下值修改其中的配置:
tickTime=2000
dataDir= /unilifeData/zookeeper/
initLimit=5
syncLimit=2
clientPort=2191
server.1=db1:2888:3888
server.2=db2:2888:3888
server.3=db3:2888:3888
tickTime:zookeeper中使用的基本时间单位, 毫秒值。
initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个 tickTime 时间间隔数。这里设置为5表名最长容忍时间为 5 * 2000 = 10 秒。
syncLimit:这个配置标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2 * 2000 = 4 秒。
dataDir 和 dataLogDir 看配置就知道干吗的了,不用解释。
clientPort:监听client连接的端口号,这里说的client就是连接到Zookeeper的代码程序。
server.{myid}={ip}:{leader服务器交换信息的端口}:{当leader服务器挂了后, 选举leader的端口}
(3)创建/home/unilife/zookeeper-cluster/data/快照目录,并创建server id文件。
#mkdir /unilifeData/zookeeper/
#cd /unilifeData/zookeeper/
在该目录下创建名为myid的文件,内容为1(这个值随server而改变)。
(4)将DB1上已经配置好的/home/unilife/zookeeper-cluster/目录拷贝至DB2和DB3。然后将其上的/home/unilife/zookeeper-cluster/data/myid的内容修改为2和3.
scp -r /home/unilife/zookeeper-cluster/ db2:~/
scp -r /home/unilife/zookeeper-cluster/ db3:~/
5、最后分别启动DB1、DB2、DB3上的zookeeper
/home/unilife/zookeeper-cluster/bin/zkServer.sh start #启动
2、MySQL集群(主从集群)
先在每台集群上安装MySQL,并启动服务
官网下载MySQL源码安装包,
wget
- 安装依赖环境
yum install -y gcc gcc-c++ cmake ncurses-devel
- 添加MySQL用户
useradd -M -s /sbin/nologin mysql
- 解压编译安装
tar –zxf mysql-5.6.26.tar.gz
cd mysql-5.6.26
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all
make
make install
- 初始化数据库
cd /usr/local/mysql/scripts
./ mysql_install_db –user=mysql –basedir=/usr/local/mysql –datadir=/ unilifeData/mysqlData
- 创建启动脚本和配置文件
#cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
#chmod 755 /etc/rc.d/init.d/mysqld
#chkconfig mysqld on
#cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
#
DB1的my.cnf配置文件内容
[client]
port = 3306
socket = /unilifeData/mysqlData/mysql/mysql.sock
max_allowed_packet=64M
# The MySQL server
[mysqld]
log-error=/unilifeData/mysqlData/mysql/mysqld.err
lower_case_table_names=1
port = 3306
socket = /unilifeData/mysqlData/mysql/mysql.sock
datadir = /unilifeData/mysqlData/mysql
character_set_server=utf8
skip-external-locking
key_buffer_size = 512M
max_allowed_packet=64M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
innodb_buffer_pool_size = 4G
max_connections = 1000
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
expire_logs_days = 31
# server-id 配置主从时,每台机器server-id不能一样
DB2的my.cnf配置文件内容
[client]
port = 3306
socket = /unilifeData/mysqlData/mysql/mysql.sock
max_allowed_packet=64M
# The MySQL server
[mysqld]
log-error=/unilifeData/mysqlData/mysql/mysqld.err
lower_case_table_names=1
port = 3306
socket = /unilifeData/mysqlData/mysql/mysql.sock
datadir = /unilifeData/mysqlData/mysql
character_set_server=utf8
skip-external-locking
key_buffer_size = 512M
max_allowed_packet=64M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
innodb_buffer_pool_size = 4G
max_connections = 1000
log-bin=mysql-bin
binlog_format=mixed
server-id = 2
expire_logs_days = 7
DB3的my.cnf配置文件内容
[client]
port = 3306
socket = /unilifeData/mysqlData/mysql/mysql.sock
max_allowed_packet=64M
# The MySQL server
[mysqld]
log-error=/unilifeData/mysqlData/mysql/mysqld.err
lower_case_table_names=1
port = 3306
socket = /unilifeData/mysqlData/mysql/mysql.sock
datadir = /unilifeData/mysqlData/mysql
character_set_server=utf8
skip-external-locking
key_buffer_size = 512M
max_allowed_packet=64M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
innodb_buffer_pool_size = 4G
max_connections = 1000
log-bin=mysql-bin
binlog_format=mixed
server-id = 3
expire_logs_days = 7
- 启动MySQL服务
service mysqld start
- 配置主从
这里以DB1作为主服务,DB2和DB3为从服务。
登录DB1的MySQL,创建一个用于同步数据的用户
#mysql –uroot –p
#grant replication slave,file,select on *.* to 'repl'@' 10.105.4.175' identified by '123456'
#grant replication slave,file,select on *.* to 'repl'@' 10.105.99.60' identified by '123456'
获取主服务器状态
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 770 | | | |
+------------------+----------+--------------+------------------+-------------------+
记录下这两个数值,等会同步会用到。
登录DB2和DB3的MySQL,执行以下命令同步数据库
#mysql –uroot –p
#change master to master_host='10.105.44.118',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=770;
#start slave;
查看同步状态
show slave status\G
看到两个YES,则说明数据同步成功。主从集群到此搭建完成。
3、Mongodb集群(副本集)
只要在DB1上配置好一个,再拷贝到DB2,DB3上就可以。
1、解压安装包
tar –zxvf mongodb-linux-x86_64-rhel62-3.0.3 –C /usr/local
cd /usr/local
mv mongodb-linux-x86_64-rhel62-3.0.3 mongodb
2、创建mongodb目录和配置文件
mkdir /usr/local/mongodb/conf
mkdir /usr/local/mongodb/data
mkdir /usr/local/mongodb/logs
创建配置文件
vi /usr/local/mongodb/conf/replset.conf
加入以下内容:
dbpath=/usr/local/mongodb/data/replset
logpath=/usr/local/mongodb/logs/replset.log
pidfilepath=/usr/local/mongodb/replset.pid
replSet=rs
port=28018
fork=true
3、创建服务启动脚本
vi /usr/local/mongodb/mongodb.sh
添加以下内容:
#!/bin/sh
start() {
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/replset.conf
}
stop() {
/usr/local/mongodb/bin/mongod --shutdown -f /usr/local/mongodb/conf/replset.conf
}
restart() {
stop
start
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "start|stop|restart"
exit 1
esac
给脚本添加执行权限
chmod 755 /usr/local/mongodb/mongodb.sh
把mongodb目录发送到DB2,DB3相同路径下
#scp –r /usr/local/mongodb/ db2: /usr/local/
#scp –r /usr/local/mongodb/ db3: /usr/local/
启动服务
分别在DB1,DB2,DB3上执行命令:
/usr/local/mongodb/mongodb.sh start
创建副本集
在DB1上登录mongodb,执行以下命令。
#/usr/local/mongodb/bin/mongo 127.0.0.1:28018
切换到管理员
#use admin
输入创建副本命令
db.runCommand(
{
"replSetInitiate":
{
"_id":"rs",
"members":
[
{
"_id":1,
"host":"10.105.44.118:28018"
},
{
"_id":2,
"host":"10.105.4.175:28018"
},
{
"_id":3,
"host":"10.105.99.60:28018"
}
]
}
})
执行完,命令行左边会显示副本集名称和当前服务器的角色
rs:PRIMARY>
表示副本集是rs,角色PRIMARY是主节点,SECONDARY是从节点。
查看副本集状态
rs.status()
4、Redis集群
1、安装ruby环境
yum install zlib ruby ruby-devel rubygems
2.编译安装redis
wget http://download.redis.io/releases/redis-3.2.1.tar.gz
tar -zxvf redis-3.2.1.tar
cd redis-3.2.1/
make
创建redis集群目录
mkdir /usr/local/redis-cluster/
mkdir /usr/local/redis-cluster/{bin,logs,conf,db}
把当前编译目录下的redis.conf和utils目录拷贝到/usr/local/redis-cluster/
cp redis.conf /usr/local/redis-cluster/
cp –r utils /usr/local/redis-cluster/
把redis的一些二进制程序拷贝到/usr/local/redis-cluster/bin目录下
cd src
cp redis-c* /usr/local/redis-cluster/bin
cp redis-s* /usr/local/redis-cluster/bin
cp redis-trib.rb /usr/local/redis-cluster/bin
2、安装gem-redis
gem install redis --version 3.2.2
#由于源的原因,可能下载失败,就手动下载下来安装
wget http://rubygems.global.ssl.fastly.net/gems/redis-3.2.2.gem
gem install -l redis-3.2.2.gem
3、创建redis实例
通过utils目录下的install_server.sh脚本安装实例
按回车确定,将生成实例,并创建一个启动脚本redis_7379,通过它可以启动服务。
4、修改配置文件
bind 0.0.0.0
daemonize yes
pidfile /var/run/redis_7379.pid
appendonly yes
cluster-enabled yes
cluster-config-file nodes-7379.conf
cluster-node-timeout 15000
5、拷贝文件到其他节点
scp –r /usr/local/redis-cluster/ db2:/usr/local
scp –r /usr/local/redis-cluster/ db3:/usr/local
scp /etc/rc.d/init.d/redis_7379 db2: /etc/rc.d/init.d/
scp /etc/rc.d/init.d/redis_7379 db3: /etc/rc.d/init.d/
6、重启redis服务
service redis_7379 restart
查看服务状态
7、把节点添加到集群
# /usr/local/redis-cluster/bin/redis-trib.rb create --replicas 0 10.105.44.118:7379 10.105.4.175:7379 10.105.99.60:7379
8、检查集群状态
#/usr/local/redis-cluster/bin/redis-trib.rb check 10.105.44.118:7379
可以看到三个节点已经添加到集群,都为主节点。状态都是OK
到此Redis集群搭建完成。