Corosync+Pacemaker+Isici实现MySQL的高可用
ISICI简介:
ISCSI(Internet SCSI):又称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术。利用了TCP/IP的端口860和3260作为沟通的渠道。透过两部计算机之间利用ISCSI的协议来交换SCSI命令,让计算机可以透过高速的局域网集线来把SAN模拟成为本地的储存装置。
与传统的SCSI技术比较起来,ISCSI技术有以下三个革命性的变化:
1、把原来只用于本机的SCSI协义通过TCP/IP网络发送,使连接距离可作无限的地域延伸;
2、连接的服务器数量无限(原来的SCSI-3的上限是15);
3、由于是服务器架构,因此也可以实现在线扩容以至动态部署。
C/S架构:
Server:scsi-target-utils
Client:iscsi-initiator-utils
实验拓扑:
实验环境:
OS:CentOS-6.7-x86_64
Node1:
IP:eth0,192.168.1.4
VIP:eth0:0,192.168.1.3
Node2:
IP:eth0,192.168.1.5
VIP:eth0:0,192.168.1.3
ISCSI+NTP:
IP:192.168.1.6
需要资源:VIP、mysqld、存储
实验流程:
配置高可用集群的前提:
1、时间必须保持同步:使用ntp服务器
[root@node2 ~]# yum install ntp
[root@node2 ~]# vim /etc/ntp.conf
restrict 192.168.1.0 mask 255.255.255.0 nomodify
server 127.127.1.0
fudge 127.127.1.0 stratum 1
启动服务:
[root@node2 ~]# chkconfig ntpd on
[root@node2 ~]# service ntpd start
各节点添加对时任务:
[root@node0 ~]# crontab -e
*/5 * * * * /usr/sbin/ntpdate 192.168.1.6 &> /dev/null
2、节点必须名称互相通信:
编辑/etc/host 解析节点名称:
[root@node0 ~]# vim /etc/hosts
192.168.1.4 node0.chencer.org node0
192.168.1.5 node1.chencer.org node1
3、ssh密钥认证进行通信;
节点间ssh互信认证:
[root@node0 ~]# ssh-keygen -t rsa
[root@node0 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
安装配置iscsi服务端:
提供硬盘分区:
[root@node2 ~]# fdisk -l /dev/sdb1
Disk /dev/sdb1: 10.7 GB, 10742183424 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
安装server端:
[root@node2 ~]# yum install iscsi-initiator-utils
查看安装生成文件:
[root@node2 ~]# rpm -ql scsi-target-utils
/etc/rc.d/init.d/tgtd \\:服务启动脚本;
/etc/tgt/targets.conf \\:主配置文件;
/usr/sbin/tgtadm \\:配置工具;
启动服务:
[root@node2 ~]# chkconfig tgtd on
[root@node2 ~]# service tgtd start
有两种配置方式:
1、编辑主配置文件/etc/tgt/targets.conf;配置文件生成的iscsi target系统重启之后不会丢失
2、使用tgtadm配置工具;此命令配置的iscsi target系统重启之后会丢失
在此使用tgtadmin配置工具,顺便介绍命令使用方法:
服务端配置管理工具tgtadm的使用:
tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION]...
1、添加一个新的target且其ID为[id],名字为[name]:
--lld [driver] --op new --mode target --tid=[id] --targetname [name]
2、显示所有或某个特定的target:
--lld [driver] --op show --mode target [--tid=[id]]
3、向某ID为[id]的设备上添加一个新的LUN,其号码为[lun],且此设备提供给initiator使用;[path]是某“块设备”的路径,此块设备也可以是raid或lvm设备。lun0已经被系统预留;
--lld [driver] --op new --mode=logicalunit --tid=[id] --lun=[lun] --backing-store [path]
4、删除ID为[id]的target:
--lld [driver] --op delete --mode target --tid=[id]
5、删除target [id]中的LUN [lun]:
-lld [driver] --op delete --mode=logicalunit --tid=[id] --lun=[lun]
6、定义某target的基于主机的访问控制列表,其中,[address]表示允许访问此target的initiator客户端的列表:
--lld [driver] --op bind --mode=target --tid=[id] --initiator-address=[address]
7、解除target [id]的访问控制列表中[address]的访问控制权限:
--lld [driver] --op unbind --mode=target --tid=[id] --initiator-address=[address]
例如: 创建一个target:
[root@node2 ~]# tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2015-10.org.chencer:tsan.disk1
创建LUN,号码为1:
[root@node2 ~]# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sdb1
开放给192.168.1.0/24网络中的主机访问:其中的-I相当于--initiator-address
[root@node2 ~]# tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.168.1.0/24
显示所有:
[root@node2 ~]# tgtadm --lld iscsi --op show --mode target
安装client端:
[root@node0 ~]# yum install iscsi-initiator-utils
initiatorname重命名:
[root@node0 ~]# echo "InitiatorName=`iscsi-iname -p iqn.2015-10.org.chencer`" > /etc/iscsi/initiatorname.iscsi
iscsi-iname -p iqn.2015-10.org.chencer
[root@node0 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2015-10.org.chencer:a02352b8395
[root@node1 ~]# echo "InitiatorName=`iscsi-iname -p iqn.2015-10.org.chencer`" > /etc/iscsi/initiatorname.iscsi
[root@node1 ~]# cat /etc/iscsi/initiatorname.iscsi
.InitiatorName=iqn.2015-10.org.chencer:6b2fe6ba80a3
启动服务:
[root@node0 ~]# service iscsi start
[root@node0 ~]# service iscsid start
客户端iscsiadm工具的使用:
iscsiadm是个模式化的工具,其模式可通过-m或--mode选项指定,常见的模式有discovery、node、fw、session、host、iface几个,如果没有额外指定其它选项,则discovery和node会显示其相关的所有记录;session用于显示所有的活动会话和连接,fw显示所有的启动固件值,host显示所有的iSCSI主机,iface显示/var/lib/iscsi/ifaces目录中的所有ifaces设定。
iscsiadm -m discovery [ -d debug_level ] [ -P printlevel ] [ -I iface -t type -p ip:port [ -l ] ]
iscsiadm -m node [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ [ -T tar-getname -p ip:port -I iface ] [ -l | -u | -R | -s] ] [ [ -o operation ]
-d,--debug=debug_level:显示debug信息,级别为0-8;
-l,--login
-t,--type=type:这里可以使用的类型为sendtargets(可简写为st)、slp、fw和isns,此选项仅用于discovery模式,且目前仅支持st、fw和isns;其中st表示允许每个target发送一个可用target列表给initiator;
-p,--portal=ip[:port]:指定target服务的IP和端口;
-m,--mode op:可用的mode有discovery、node、fw、host iface和session;
-T,--targetname=targetname:用于指定target的名字
-u,--logout
-o,--op=OPEARTION:指定针对discoverydb数据库的操作,其仅能为new、delete、update、show和nonpersistent其中之一;
-I,--interface=[iface]:指定执行操作的iSCSI接口,这些接口定义在/var/lib/iscsi/ifaces中;
登陆查找到的设备:
# [root@node0 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.1.6
192.168.1.6:3260,1 iqn.2015-10.org.chencer:tsan.disk1
[root@node0 ~]# iscsiadm -m node -T iqn.2015-10.org.chencer:tsan.disk1 -p 192.168.1.6:3260 -l
Logging in to [iface: default, target: iqn.2015-10.org.chencer:tsan.disk1, portal: 192.168.1.6,3260] (multiple)
Login to [iface: default, target: iqn.2015-10.org.chencer:tsan.disk1, portal: 192.168.1.6,3260] successful.
查看客户端设备,多了一块设备;创建分区,并创建文件系统:
[root@node0 ~]# fdisk –l /dev/sdc1
二进制格式安装Mysql-5.5:
解决软件依赖关系:
[root@node0 ]# yum install libaio
Iscsi设备挂载至/data目录,并创建mysql用户:
[root@node0 ~]# mkdir /data
[root@node0 ~]# mount /dev/sdc1 /data/
[root@node0 ~]# groupadd -g 306 -r mysql
[root@node0 ~]# useradd -u 306 -g 306 -r mysql
[root@node0 mysql]# mkdir /data/mydata
[root@node0 mysql]# chown -R mysql.mysql /data/
二进制安装设置:
[root@node0 ~]# tar xf mysql-5.5.47-linux2.6-x86_64.tar.gz -C /usr/local/
[root@node0 ~]# cd /usr/local/
[root@node0 local]# ln -sv mysql-5.5.47-linux2.6-x86_64 mysql
"mysql" -> "mysql-5.5.47-linux2.6-x86_64"
[root@node0 local]# cd mysql/
[root@node0 mysql]# chown -R root.mysql ./*
[root@node0 mysql]# scripts/mysql_install_db --user=mysql --datadir=/data/mydata/
导出头文件、库文件、man手册:
[root@node0 mysql]# ln -sv /usr/local/mysql/include /usr/include/mysql
"/usr/include/mysql" -> "/usr/local/mysql/include"
[root@node0 mysql]# vim /etc/ld.so.conf.d/mysql-5.5-x86_64.conf
/usr/local/mysql/lib
[root@node0 mysql]# ldconfig
[root@node0 mysql]# vim /etc/man.config
MANPATH /usr/local/mysql/man
添加并重读环境变量:
[root@node0 mysql]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@node0 mysql]# source /etc/profile.d/mysql.sh
提供配置文件和服务启动脚本:
[root@node0 mysql]# mkdir /etc/mysql
[root@node0 mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf
[root@node0 mysql]# vim /etc/mysql/my.cnf
[mysqld]
datadir = /data/mydata
thread_concurrency = 2
[root@node0 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@node0 mysql]# chmod +x /etc/rc.d/init.d/mysqld
加入服务列表,保证开机不自动启动:
[root@node0 mysql]# chkconfig --add mysqld
[root@node0 mysql]# chkconfig mysqld off
node1测试启动数据库:
[root@node0 mysql]# service mysqld start
Starting MySQL... SUCCESS!
为数据库创建并授权测试用户:
[root@node0 mysql]# mysql
mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on *.* to root@'192.168.1.%' identified by 'rootroot';
Query OK, 0 rows affected (1.65 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
切换至另一节点测试:
[root@node0 mysql]# service mysqld stop
Shutting down MySQL. SUCCESS!
[root@node0 mysql]# umount /data/
登陆查找到的设备:
[root@node1 dev]# iscsiadm -m discovery -t sendtargets -p 192.168.1.6
192.168.1.6:3260,1 iqn.2015-10.org.chencer:tsan.disk1
[root@node1 dev]# iscsiadm -m node -T iqn.2015-10.org.chencer:tsan.disk1 -p 192.168.1.6:3260 -l
Logging in to [iface: default, target: iqn.2015-10.org.chencer:tsan.disk1, portal: 192.168.1.6,3260] (multiple)
Login to [iface: default, target: iqn.2015-10.org.chencer:tsan.disk1, portal: 192.168.1.6,3260] successful.
[root@node1 dev]# fdisk -l /dev/sdc
挂载并启动服务:
[root@node1 mysql]# mkdir /data
[root@node1 mysql]# mount /dev/sdc1 /data/
[root@node1 mysql]# service mysqld start
Starting MySQL... SUCCESS!
连接测试数据库:
[root@node1 mysql]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+
5 rows in set (0.34 sec)
停止服务,并卸载存储:
[root@node1 mysql]# service mysqld stop
Shutting down MySQL. SUCCESS!
[root@node1 mysql]# umount /data/
安装配置corosync+pacemaker+crmsh:
[root@node0 ~]# cat /etc/yum.repos.d/networkha-clusteringStable.repo
[network_ha-clustering_Stable]
name=Stable High Availability/Clustering packages (CentOS_CentOS-6)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/
enabled=1
gpgcheck=0
gpgkey=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/repodata/repomd.xml.key
[root@node0 ~]# yum install corosync pacemaker crmsh
生成认证文件:
[root@node0 corosync]# corosync-keygen
编辑配置文件:
[root@node0 ~]# cd /etc/corosync/
[root@node0 corosync]# cp corosync.conf.example.udpu corosync.conf
[root@node0 corosync]# vim corosync.conf
compatibility: whitetank
totem {
version: 2
secauth: off
interface {
member {
memberaddr: 192.168.1.4
}
member {
memberaddr: 192.168.1.5
}
ringnumber: 0
bindnetaddr: 192.168.1.0
mcastaddr: 239.255.1.1
mcastport: 5405
ttl: 1
}
transport: udpu
}
logging {
fileline: off
to_logfile: no
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
为pacemaker提供配置文件:
[root@node0 corosync]# vim service.d/pcmk
service {
# Load the Pacemaker Cluster Resource Manager
name: pacemaker
ver: 1
}
将以上文件复制给另一节点:
[root@node0 corosync]# scp -r authkey corosync.conf service.d node1:/etc/corosync/
两节点启动corosync和pacemaker服务:
[root@node0 corosync]# service corosync start;service pacemaker start;ssh node1 'service corosync start;service pacemaker start'
查看当前状态:
[root@node0 corosync]# crm status
Last updated: Sun Jan 24 17:36:46 2016
Last change: Sun Jan 24 17:36:34 2016
Stack: classic openais (with plugin)
Current DC: node1.chencer.org - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
0 Resources configured
Online: [ node0.chencer.org node1.chencer.org ]
配置集群的工作属性:
而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用;并且因为双节点,所以忽略法定数:
[root@node0 ~]# crm \\:进入交互式命令界面;
crm(live)# configure \\:进入configure模式;
crm(live)configure# property stonith-enabled=false \\:禁用stonith
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# verify \\:检查配置;
crm(live)configure# commit \\:保存配置;
添加资源:VIP、Filesystem、mysqlserver
crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=192.168.1.3 op monitor interval=10s timeout=20s
crm(live)configure# primitive data ocf:heartbeat:Filesystem params device="/dev/sdc1" directory="/data" fstype="ext4" op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s
crm(live)configure# primitive mysql lsb:mysqld op monitor interval=20s timeout=30s
crm(live)configure# verify
定义各种资源约束:
crm(live)configure# colocation vip_with_data inf: vip data
crm(live)configure# colocation mysql_with_data inf: mysql data
crm(live)configure# order data_after_vip inf: vip data
crm(live)configure# order mysql_after_data inf: data mysql
crm(live)configure# verify
crm(live)configure# commit
查看所有资源:
crm(live)configure# show
node node0.chencer.org
node node1.chencer.org
primitive data Filesystem \
params device="/dev/sdc1" directory="/data" fstype=ext4 \
op monitor interval=20s timeout=40s \
op start timeout=60s interval=0 \
op stop timeout=60s interval=0
primitive mysql lsb:mysqld \
op monitor interval=20s timeout=30s
primitive vip IPaddr \
params ip=192.168.1.3 \
op monitor interval=10s timeout=20s
colocation mysql_with_data inf: mysql data
colocation vip_with_data inf: vip data
order data_after_vip inf: vip data
order mysql_after_data inf: data mysql
property cib-bootstrap-options: \
dc-version=1.1.11-97629de \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes=2 \
stonith-enabled=false \
no-quorum-policy=ignore
启动资源组,查看资源状态:
crm(live)# status
Last updated: Sun Jan 24 17:48:20 2016
Last change: Sun Jan 24 17:46:45 2016
Stack: classic openais (with plugin)
Current DC: node1.chencer.org - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
3 Resources configured
Online: [ node0.chencer.org node1.chencer.org ]
vip (ocf::heartbeat:IPaddr): Started node0.chencer.org
data (ocf::heartbeat:Filesystem): Started node0.chencer.org
mysql (lsb:mysqld): Started node0.chencer.org
连接数据库测试:
[root@node2 ~]# mysql -h192.168.1.3 -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+
5 rows in set (0.06 sec)
mysql> create database tdb;
Query OK, 1 row affected (0.00 sec)
转移资源,测试链接数据库:
crm(live)# node standby
crm(live)# status
Last updated: Sun Jan 24 17:52:01 2016
Last change: Sun Jan 24 17:51:56 2016
Stack: classic openais (with plugin)
Current DC: node1.chencer.org - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
3 Resources configured
Node node0.chencer.org: standby
Online: [ node1.chencer.org ]
vip (ocf::heartbeat:IPaddr): Started node1.chencer.org
data (ocf::heartbeat:Filesystem): Started node1.chencer.org
mysql (lsb:mysqld): Started node1.chencer.org
[root@node2 ~]# mysql -h192.168.1.3 -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| tdb |
| test |
| testdb |
+--------------------+
6 rows in set (0.06 sec)
数据同步成功。