前提:本文使用RHEL5.8的光盘制作yum命令的安装源来安装所依赖的软件包,关于如何使用光盘制作yum源,请参考:
http://blog.chinaunix.net/uid-20346344-id-3264166.html
服务器搭建环境:
server1.mjwdj.com:eth0:192.168.10.10/24 RHEL 5.8 i386
server2.mjwdj.com:eth0:192.168.10.20/24 RHEL 5.8 i386
server3.mjwdj.com:eth0:192.168.10.30/24 RHEL 5.8 i386
系统均采用最小化安装,然后配置yum,在安装过程中我会用yum命令安装必要的软件来解决依赖性问题。
需要的软件包,按照个人习惯,我存放到每台机器的/home/share/下:(可以到官方网站下载,)
Percona-XtraDB-Cluster-devel-5.5.29-23.7.1.387.rhel5.i686.rpm
Percona-XtraDB-Cluster-shared-5.5.29-23.7.1.387.rhel5.i686.rpm
Percona-XtraDB-Cluster-client-5.5.29-23.7.1.387.rhel5.i686.rpm
Percona-XtraDB-Cluster-galera-2.0-1.143.rhel5.i386.rpm
percona-xtrabackup-2.0.5-499.rhel5.i386.rpm
Percona-XtraDB-Cluster-server-5.5.29-23.7.1.387.rhel5.i686.rpm
一、安装必要的软件包
mount /dev/hdc /mnt/iso/
yum install nc rsync libaio
二、安装Percona-XtraDB-Cluster,注1
cd /home/share/
rpm -ivh --nodeps Percona-XtraDB-Cluster-devel-5.5.29-23.7.1.387.rhel5.i686.rpm
rpm -ivh --nodeps Percona-XtraDB-Cluster-shared-5.5.29-23.7.1.387.rhel5.i686.rpm
rpm -ivh --nodeps Percona-XtraDB-Cluster-client-5.5.29-23.7.1.387.rhel5.i686.rpm
rpm -ivh Percona-XtraDB-Cluster-galera-2.0-1.143.rhel5.i386.rpm
rpm -ivh percona-xtrabackup-2.0.5-499.rhel5.i386.rpm
rpm -ivh --nodeps Percona-XtraDB-Cluster-server-5.5.29-23.7.1.387.rhel5.i686.rpm
三、初始化数据库
mkdir -p /var/lib/mysql_data
chown -R mysql:mysql /var/lib/mysql_data/
mysql_install_db --datadir=/var/lib/mysql_data --user=mysql
四、建立配置文件,注2
因为3台主机的地位是完全一样的,因此之前的步骤也完全一样。
echo '[mysqld_safe]
wsrep_urls=gcomm://192.168.10.10:4567,gcomm://192.168.10.20:4567,gcomm://192.168.10.30:4567,gcomm://
[mysqld]
datadir=/var/lib/mysql_data
user=mysql
binlog_format=ROW
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_slave_threads=2
wsrep_cluster_name=mjwdjdbcluster
wsrep_sst_method=rsync
wsrep_node_name=node1
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2' > /etc/my.cnf
上面的配置文件除了一行“wsrep_node_name”,需要指定不同的node名以外,其他部分三台主机完全一样。
我用的分别是“wsrep_node_name=node1”,“wsrep_node_name=node2”,“wsrep_node_name=node3”。
五、启动和关闭数据库,注3
启动前,请务必仔细阅读“注3”!!!
启动数据库用mysqld_safe &
停止数据库用service mysql stop
六、数据库服务的日志
tail /var/lib/mysql_data/server1.mjwdj.com.err
tail /var/lib/mysql_data/server3.mjwdj.com.err
tail /var/lib/mysql_data/server2.mjwdj.com.err
七、测试
可参考注3
3台主机中有任何一台出现故障,数据库依然完整。故障修复后,将故障主机启动后数据会自动同步。3台主机的角色是完全一样的。
如果2台主机出现故障,那也许还是好事,你就可以多出很多时间来为自己放假了,因为很有可能你被公司开除了!
因此不管有多少台主机的集群,只要其中有2台主机是正常的,系统就能正常运行。也就是说集群的安全性是随着主机数量的增加而增加的。
注1
这里的命令用了--nodeps,不必担心依赖性问题,之前的yum命令已经解决了;但如果不用会提示与mysql冲突,其实系统并没有安装任何与mysql有关的包;为什么会有这提示我真不明白。
注2
配置文件其实比较好理解,要详细的解释,请参考官方文档。这里把要修改的做个说明,其他的可以保持默认:
wsrep_provider=/usr/lib/libgalera_smm.so 如果是64为系统则是/usr/lib64/libgalera_smm.so
wsrep_cluster_name=mjwdjdbcluster 这个是自己定义的名字,自己认得就行
wsrep_node_name=node1 每个node都需要个名字,不知道是不是可以随便取名,反正我用了node1,node2和node3,当然不能有相同的。
wsrep_slave_threads #指定线程数量
另外,为了使用Percona XtraBackup的State Transfer method(节点间数据的快照副本拷贝)。可以使用支持Galera信息的脚本的正式的xtrabackup包,可以从innobackupex源码包中得到innobackupex脚本。同时在my.cnf文件中制定:
wsrep_sst_method=xtrabackup
注3
第一次启动服务时需要注意,可以先启动3台机器中任何一台的mysqld_safe &(比如server2上的),观察日志没发现错误。
然后启动另外2台机器上的mysqld_safe &,观察日志也没发现错误,但是这时发现后面2台主机没有加入到集群,3台主机各自为阵。
究其原因可能是因为在启动服务是系统会自动查找对等服务器的日志来更新数据库,但3台主机上均无更新日志且数据完全一样就无法确定数据复制的方向。
如何来让3台主机成为一个集群呢?这时只需要在其中任何一台主机上做修改,然后重启另外2台机器上的数据库服务即可。
比如:
在server3上执行create database newdatabase;
在server1和server2上执行service mysql stop,再执行mysqld_safe &。
然后观察server1和server2上的日志,发现都已经加入到集群。
当然也可以进入server1或者server2,看到新建的newdatabase数据以及同步到本地了。
文章写到最后,才发现每台主机都是不同的IP!所谓的高可用,到底怎么用呢?前端的通常是php,但php怎么取访问不同IP的mysql服务器呢?这个我真不知道,估计又要用heartbeat或keepalived来实现吧?!
但我知道Percona-XtraDB-Cluster至少能保证数据的安全性,不至于丢失。
更吸引人的地方是依据Percona-XtraDB-Cluster的特性,能在“写入较少读取较多的环境下”搭配mysql-proxy或者lvs组成高性能集群,一定会有非常好的性能表现。