数据库MySQL,Mongodb,Redis及Zookeeper集群搭建文档java
为何咱们要用集群?node
首先是集群的高可用性:mysql
构建集群的一个最大亮点和优势就是集群都具备高可用性,能够提供不间断性服务,从而保证了业务的持续运行,当服务出现故障时,集群系统能够自动的将服务从故障节点切换到备用节点。对于一些要求实时服务很强的应用系统,必须保证服务的24小时不间断运行,而因为其余人为或者不可预知的缘由,单一的设备运行环境很难提供这种服务要求,因此构建集群系统是不可或缺的选择。linux
其次是集群的可扩展性:c++
集群的可扩展性体如今随时可以知足用户的需求,随着业务量的加大,现有的集群服务实体不能知足需求时,能够向此集群中动态的加入一个或多个服务节点,加强集群的总体性能。这就是集群可扩展性的体现。redis
最后就是集群的负载均衡sql
经过灵活、有效的系统分担负载,结合集群量身定制的负载分担策略,将客户端的访问合理的分配到各个服务节点,从而有效的利用资源,实现负载均衡mongodb
准备3台机器组建一个小集群环境。它们的IP地址分别为10.105.44.118, 10.105.4.175和10.105.99.60. 将它们的host分别命名为db1,db2和db3。数据库
服务器:DB1,DB2,DB3ruby
系统: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
注:先在DB一、DB二、DB3上分别执行(1)-(3)步,配置Java环境。
一、安装Zookeeper须要先装JDK,去Oracle的官网下载jdk。
http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz
二、解压安装包
tar –zxf jdk-7u79-linux-x64.tar.gz –C /usr/local
cd /usr/local
ln –sv jdk1.7.0_79/ jdk
[root@cdh1 ~]# vi /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:JAVA_HOME/bin
[root@cdh1 ~]# chmod 755 /etc/profile.d/jdk.sh
[root@cdh1 ~]# . /etc/profile.d/jdk.sh
三、查看是否安装成功
[root@cdh1 ~]# 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@cdh1 ~]#
四、安装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:~/
五、最后分别启动DB一、DB二、DB3上的zookeeper
/home/unilife/zookeeper-cluster/bin/zkServer.sh start #启动
先在每台集群上安装MySQL,并启动服务
官网下载MySQL源码安装包,
wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.26.tar.gz
yum install -y gcc gcc-c++ cmake ncurses-devel
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
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,则说明数据同步成功。主从集群到此搭建完成。
只要在DB1上配置好一个,再拷贝到DB2,DB3上就能够。
一、解压安装包
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
二、建立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
三、建立服务启动脚本
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()
一、安装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
二、安装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
三、建立redis实例
经过utils目录下的install_server.sh脚本安装实例
按回车肯定,将生成实例,并建立一个启动脚本redis_7379,经过它能够启动服务。
四、修改配置文件
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
五、拷贝文件到其余节点
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/
六、重启redis服务
service redis_7379 restart
查看服务状态
七、把节点添加到集群
# /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
八、检查集群状态
#/usr/local/redis-cluster/bin/redis-trib.rb check 10.105.44.118:7379
能够看到三个节点已经添加到集群,都为主节点。状态都是OK
到此Redis集群搭建完成。