數據庫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集羣搭建完成。