LVS+KEEPALIVED+MYSQL
單點寫入讀負載均衡主主同步高可用方案安裝教程
一、 安裝環境
Ø 軟件版本
CENTOS 6.5
KEEPALIVED 1.2.12 | 下載
LVS 1.2.6 | 下載
MYSQL 5.6.17(社區版) | 下載
Ø
硬件環境
兩臺服務器, IP分別爲:192.168.214.11(主機名:MYSQL-1) / 192.168.214.12(主機名MYSQL-2)
寫VIP(單點): 192.168.214.13
讀VIP(負載均衡): 192.168.214.14
二、 安裝流程
1.
OS安裝與配置
最小化安裝(安裝時選擇Minimal)CENTOS後,分別設置兩臺機器的IP與主機名
Ø 修改/etc/sysconfig/network文件
1
2
3
|
|
NETWORKING=yes
HOSTNAME=MYSQL-1 #主機名 GATEWAY=192.168.0.1 #網關
|
Ø 修改/etc/sysconfig/network-scripts/ifcfg-eth0文件
1
2
3
4
5
6
7
8
9
|
DEVICE=eth0
HWADDR=00:0C:29:56:8F:AD TYPE=Ethernet
UUID=ba48a4c0-f33d-4e05-98bd-248b01691c20
ONBOOT=yes NM_CONTROLLED=yes
BOOTPROTO=static IPADDR=192.168.0.231 #本機IP NETMASK=255.255.255.0
|
Ø 修改/etc/resolv.conf文件(設置DNS)
1
2
|
nameserver 202.103.24.68 #DNS服務器地址 search localdomain
|
Ø 修改/etc/hosts文件,將圈出來的部分改爲自己的主機名
Ø 重啓網卡&查看當前主機名是否修改
1
2
|
[root@MYSQL-1 ~]# service network restart [root@MYSQL-1 ~]# hostname
|
如果未修改成功,重啓系統。
* 如果發現LINUX SSH連接緩慢,在server上/etc/ssh/sshd_config文件中加入UseDNS=no。然後/etc/init.d/sshd restart重啓sshd進程使配置生效
2.
MYSQL安裝與配置
Ø 安裝依賴
123
|
[root@MYSQL-1 ~]# yum -y install wget gcc gcc-c++ ncurses ncurses-devel openssl openssl-devel libtool* libaio .......省略安裝過程打印日誌 Complete! <--安裝成功
|
Ø 檢查MySQL及相關RPM包,是否安裝,如果有安裝,則移除
1
2
3
|
[root@MYSQL-1 ~]# rpm -qa | grep -i mysql mysql-libs-5.1.71-1.el6.x86_64 <--說明預裝了依賴庫 [root@MYSQL-1 ~]# yum -y remove mysql-libs*
|
Ø 創建linux用戶mysql
1
2
3
4
5
6
|
[root@MYSQL-1 ~]# useradd mysql [root@MYSQL-1 ~]# passwd mysql 更改用戶 mysql 的密碼 。 新的 密碼: 重新輸入新的 密碼: passwd: 所有的身份驗證令牌已經成功更新。
|
Ø 將mysql用戶加入sudoers組(因爲安裝MYSQL需要ROOT權限)
1
2
3
4
5
6
7
|
[root@MYSQL-1 ~]# chmod u+w /etc/sudoers <--給與文件可修改權限 [root@MYSQL-1 ~]# vi /etc/sudoers ......
root ALL=(ALL) ALL <--找出此行 mysql ALL=(ALL) ALL <--添加到這裏. :wq保存退出 ......
[root@MYSQL-1 ~]# chmod u-w /etc/sudoers <--撤銷修改權限
|
Ø 將下載完的mysql包上傳到服務器中,執行以下命令安裝
12
3
4
5
|
[root@MYSQL-1 ~]# su mysql <--切換用戶 [mysql@MYSQL-1 ~]$ tar -xvf MySQL-5.6.17-1.linux_glibc2.5.x86_64.rpm-bundle.tar <--解壓縮 [mysql@MYSQL-1 ~]$ sudo rpm -ivh MySQL-server-5.6.17-1.linux_glibc2.5.x86_64.rpm [mysql@MYSQL-1 ~]$ sudo rpm -ivh MySQL-devel-5.6.17-1.linux_glibc2.5.x86_64.rpm [mysql@MYSQL-1 ~]$ sudo rpm -ivh MySQL-client-5.6.17-1.linux_glibc2.5.x86_64.rpm
|
Ø 初始化MYSQL
1
2
3
4
|
[mysql@MYSQL-1 ~]$ sudo cp /usr/share/mysql/my-default.cnf /etc/my.cnf [mysql@MYSQL-1 ~]$ service mysql start <--啓動MYSQL Starting MySQL. SUCCESS!
[mysql@MYSQL-1 ~]$ sudo cat /root/.mysql_secret <--查看MYSQL初始密碼 # The random password set for the root user at Tue Apr 8 22:20:49 2014 (local time): T_M57CrE5vM8WfEb(初始密碼) [mysql@MYSQL-1 ~]$ /usr/bin/mysql_secure_installation <--初始化MYSQL
|
Ø 設置開機自動啓動
1
2
|
[mysql@MYSQL-1 ~]$ sudo chkconfig mysql on [sudo] password for mysql:
|
Ø 修改MYSQL默認字符集爲UTF-8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[mysql@MYSQL-1 ~]$ sudo vi /etc/my.cnf ......
[client]
default-character-set=utf8
[mysqld]
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
init_connect='SET NAMES utf8' #(注意linux下mysql安裝完後是默認:表名區分大小寫,列名不區分大小寫; 0:區分大小寫,1:不區分大小寫) lower_case_table_names=1 #(設置最大連接數,默認爲 151,MySQL服務器允許的最大連接數16384; ) max_connections=1000 [mysql]
default-character-set=utf8
...... sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES <-- 此行刪除否則無法啓動 [mysql@MYSQL-1 ~]$ service mysql restart
|
Ø 檢查字符集是否正確
1
2
3
4
|
[mysql@MYSQL-1 ~]$ mysql -uroot -p Enter password:
mysql>show variables like '%collation%'; mysql>show variables like '%char%';
|
3.
MYSQL主主複製配置
Ø 關閉防火牆,否則兩臺數據庫無法連接
1
|
[root@MYSQL-1 ~]# service iptables stop
|
Ø My.cnf配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[mysql@MYSQL-1 ~]$ sudo vi /etc/my.cnf ......
[MySQLd] <--在該節點下增加以下內容
skip-name-resolve #禁用DNS解析,解決遠程連接很慢的問題 log-bin=mysql-bin
server-id=1 #兩臺機器server-id不能相同
auto_increment_increment=2 #自增長每次增加2 auto_increment_offset=1 #自增長從1開始, 另外一臺設置爲2
#兩項保證兩臺主機中的自增長ID不會產生重複, 一臺爲奇數一臺爲偶數
#其他設置 #binlog-do-db=mydb #需要複製的數據庫名,如果複製多個數據庫,重複設置這個選項即可 #binlog-ignore-db=nonedb #不需要複製的數據庫苦命,如果複製多個數據庫,重複設置這個選項即可 #replicate-do-db=mysql #需要複製的數據庫名,如果複製多個數據庫,重複設置這個選項即可 #replicate-ignore-db=mysql #不需要複製的數據庫苦命,如果複製多個數據庫,重複設置這個選項即可 #log-slave-updates #啓用從庫日誌,這樣可以進行鏈式複製 #slave-skip-errors=all #不管發生什麼錯誤,鏡像處理工作也繼續進行 ......
[mysql@MYSQL-1 ~]$ service mysql restart;
|
Ø 創建數據庫用戶並授權
1
2
3
|
mysql> create user sartner identified by '123';
mysql> grant all privileges on *.* to user sartner;
mysql> flush privileges;
|
Ø 數據複製配置
1
2
|
mysql> grant replication slave on *.* to 'sartner'@'%' identified by '123456';
mysql> show master status;
|
記錄下File
與Position, 在另一臺數據庫([email protected])中將此數據庫設爲主數據庫
1
|
mysql> change master to master_host='192.168.214.11',master_user='sartner',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=120;
|
同樣在另一臺計算機中按照次步驟執行,設置成互爲主從(可以相互複製)
設置完畢後啓動slave
並查看slave狀態
1
2
|
mysql> start slave;
mysql> show slave status\G;
|
4.
LVS+KEEPALIVED安裝與配置
使用ROOT安裝
Ø 安裝LVS
12
|
[root@MYSQL-1 ~]# yum -y install kernel-devel ipvsadm [root@MYSQL-1 ~]# ln -sv /usr/src/kernels/2.6.32-431.11.2.el6-x86_64/ /usr/src/linux <--請自行修改kernels版本號
|
Ø 安裝keepalived
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@MYSQL-1 ~]# wget http://keepalived.org/software/keepalived-1.2.12.tar.gz [root@MYSQL-1 ~]# tar zxvf keepalived-1.2.12.tar.gz [root@MYSQL-1 ~]# cd keepalived-1.2.12 [root@MYSQL-1 ~]# ./configure --prefix=/usr/local/keepalived [root@MYSQL-1 ~]# make [root@MYSQL-1 ~]# make install [root@MYSQL-1 ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ [root@MYSQL-1 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root@MYSQL-1 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ [root@MYSQL-1 ~]# mkdir /etc/keepalived/
[root@MYSQL-1 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ [root@MYSQL-1 ~]# cp /usr/local/keepalived/sbin/keepalived /etc/keepalived/ [root@MYSQL-1 ~]# chkconfig keepalived on
|
Ø Keepalived配置/etc/keepalived/keepalived.conf(兩臺服務器不同之處已用紅色標出並註明)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
global_defs {
router_id LVS1
}
vrrp_sync_group test {
group {
loadbalance
}
}
vrrp_instance loadbalance {
state MASTER #主機(192.168.214.11)設置爲MASTER,備機(192.168.214.12)設置爲BACKUP interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 180 #主機(192.168.214.11)設置爲180,備機(192.168.214.12)設置爲150 advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.214.13 #寫VIP 192.168.214.14 #讀VIP }
}
#寫VIP配置(主備) virtual_server 192.168.214.13 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 20
protocol TCP
sorry_server 192.168.214.12 3306 #備 real_server 192.168.214.11 3306 { #主 weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
#讀VIP配置(負載均衡) virtual_server 192.168.214.14 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
# persistence_timeout 20 protocol TCP
real_server 192.168.214.11 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
real_server 192.168.214.12 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
|
Ø realserver腳本/etc/rc.d/init.d/realserver.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#!/bin/bash
# description: Config realserver lo and apply noarp SNS_VIP=192.168.214.13 SNS_VIP2=192.168.214.14 /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
ifconfig lo:1 $SNS_VIP2 netmask 255.255.255.255 broadcast $SNS_VIP2
/sbin/route add -host $SNS_VIP dev lo:0
/sbin/route add -host $SNS_VIP2 dev lo:1
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
ifconfig lo:1 down
route del $SNS_VIP >/dev/null 2>&1
route del $SNS_VIP2 >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
|
Ø 分配可執行權限
1
2
|
[root@MYSQL-1 ~]# chmod 755 /etc/rc.d/init.d/realserver.sh [root@MYSQL-1 ~]# chmod 755 /etc/rc.d/init.d/functions
|
Ø 啓動realserver以及keepalived
1
2
|
[root@MYSQL-1 ~]# /etc/rc.d/init.d/realserver.sh start [root@MYSQL-1 ~]# /etc/keepalived/keepalived start
|
Ø 查看keepalived日誌
1
|
[root@MYSQL-1 ~]# cat /var/log/messages
|
看到MYSQL-1爲主,MYSQL-2爲備則成功
三、 參考資料
MYSQL高可用探究(三)Lvs+Keepalived+Mysql單點寫入讀負載均衡主主同步高可用方案(本安裝教程基於此方案)
http://blog.chinaunix.net/uid-20639775-id-3337471.html
Centos6.0系統lvs+keepalived+mysql實現mysql數據庫熱備主主複製
http://lansgg.blog.51cto.com/5675165/1180305
MYSQL主主(雙主)複製
http://blog.csdn.net/jeffreynicole/article/details/8309451
嫌排版太爛可以下載PDF版本
http://download.csdn.net/detail/sartner/8245901