写在前面
业界对系统的高可用有着基本的要求,简单的说,这些要求可以总结为如下所示。系统架构中不存在单点问题。
可以最大限度的保障服务的可用性。
一般情况下系统的高可用可以用几个9来评估。所谓的几个9就是系统可以保证对外提供的服务的时间达到总时间的百分比。例如如果需要达到99.99的高可用,则系统全年发生故障的总时间不能超过52分钟。
系统高可用架构
我们既然需要实现系统的高可用架构,那么,我们到底需要搭建一个什么样的系统架构呢?我们可以将需要搭建的系统架构简化成下图所示。
服务器规划
由于我电脑资源有限,我这里在4台服务器上搭建高可用环境,大家可以按照本文将环境扩展到更多的服务器,搭建步骤都是一样的。主机名IP地址安装的服务binghe151192.168.175.151Mycat、Zookeeper、MySQL、HAProxy、Keepalived、Xinetd
binghe152192.168.175.152Zookeeper、MySQL
binghe153192.168.175.153Zookeeper、MySQL
binghe154192.168.175.154Mycat、MySQL、HAProxy、Keepalived、Xinetd
binghe155192.168.175.155MySQL
注意:HAProxy和Keepalived最好和Mycat部署在同一台服务器上。
安装MySQL
安装JDK
由于Mycat和Zookeeper的运行需要JDK环境的支持,所有我们需要在每台服务器上安装JDK环境。
这里,我以在binghe151服务器上安装JDK为例,其他服务器的安装方式与在binghe151服务器上的安装方式相同。安装步骤如下所示。
注:我下载的JDK安装包版本为:jdk-8u212-linux-x64.tar.gz,如果JDK版本已更新,大家下载对应的版本即可。
(2)将下载的jdk-8u212-linux-x64.tar.gz安装包上传到binghe151服务器的/usr/local/src目录下。
(3)解压jdk-8u212-linux-x64.tar.gz文件,如下所示。tar -zxvf jdk-8u212-linux-x64.tar.gz
(4)将解压的jdk1.8.0_212目录移动到binghe151服务器下的/usr/local目录下,如下所示。mv jdk1.8.0_212/ /usr/local/src/
(5)配置JDK系统环境变量,如下所示。vim /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_212
CLASS_PATH=.:$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASS_PATH PATH
使系统环境变量生效,如下所示。source /etc/profile
(6)查看JDK版本,如下所示。[root@binghe151 ~]# java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
结果显示,正确输出了JDK的版本信息,说明JDK安装成功。
安装Mycat
下载Mycat 1.6.7.4 Release版本,解压到服务器的/usr/local/mycat目录下,并配置Mycat的系统环境变量,随后,配置Mycat的配置文件,Mycat的最终结果配置如下所示。schema.xml<?xml version="1.0"?>
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
select user()
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
select user()
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
select user()
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
select user()
server.xml<?xml version="1.0" encoding="UTF-8"?>
1
druidparser
3307
3308
0
0.0.0.0
utf8mb4
2048
2
2
1800000
300
0
0
1
1000
104857600
io.mycat.server.interceptor.impl.StatisticsSqlInterceptor
UPDATE,DELETE,INSERT
/tmp/sql.txt
true
true
1
cTwf23RrpBCEmalp/nx0BAKenNhvNs2NSr9nYiMzHADeEDEfwVWlI6hBDccJjNBJqJxnunHFp5ae63PPnMfGYA==
shop
rule.xml<?xml version="1.0" encoding="UTF-8"?>
customer_id
mod-long
4
sequence_db_conf.properties#sequence stored in datanode
GLOBAL=mycat
ORDER_MASTER=mycat
ORDER_DETAIL=mycat
关于Mycat的配置,仅供大家参考,大家不一定非要按照我这里配置,根据自身业务需要配置即可。本文的重点是实现Mycat的高可用环境搭建。
在MySQL中创建Mycat连接MySQL的账户,如下所示。CREATE USER 'mycat'@'192.168.175.%' IDENTIFIED BY 'mycat';
ALTER USER 'mycat'@'192.168.175.%' IDENTIFIED WITH mysql_native_password BY 'mycat';
GRANT SELECT, INSERT, UPDATE, DELETE,EXECUTE ON *.* TO 'mycat'@'192.168.175.%';
FLUSH PRIVILEGES;
安装Zookeeper集群
安装配置完JDK后,就需要搭建Zookeeper集群了,根据对服务器的规划,现将Zookeeper集群搭建在“binghe151”、“binghe152”、“binghe153”三台服务器上。
1.下载Zookeeper
到Apache官网去下载Zookeeper的安装包,Zookeeper的安装包下载地址为:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/。具体如下图所示。
也可以在binghe151服务器上执行如下命令直接下载zookeeper-3.5.5。wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz
执行上述命令就可以直接把apache-zookeeper-3.5.5-bin.tar.gz安装包下载到binghe151服务器上。
2.安装并配置Zookeeper
注意:(1)、(2)、(3)步都是在binghe152服务器上执行的。
(1)解压Zookeeper安装包
在binghe151服务器上执行如下命令,将Zookeeper解压到“/usr/local/”目录下,并将Zookeeper目录修改为zookeeper-3.5.5。tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz
mv apache-zookeeper-3.5.5-bin zookeeper-3.5.5
(2)配置Zookeeper系统环境变量
同样,需要在/etc/profile文件中配置Zookeeper系统环境变量,如下:ZOOKEEPER_HOME=/usr/local/zookeeper-3.5.5
PATH=$ZOOKEEPER_HOME/bin:$PATH
export ZOOKEEPER_HOME PATH
结合之前配置的JDK系统环境变量,/etc/profile,总体配置如下:MYSQL_HOME=/usr/local/mysql
JAVA_HOME=/usr/local/jdk1.8.0_212
MYCAT_HOME=/usr/local/mycat
ZOOKEEPER_HOME=/usr/local/zookeeper-3.5.5
MPC_HOME=/usr/local/mpc-1.1.0
GMP_HOME=/usr/local/gmp-6.1.2
MPFR_HOME=/usr/local/mpfr-4.0.2
CLASS_PATH=.:$JAVA_HOME/lib
LD_LIBRARY_PATH=$MPC_LIB_HOME/lib:$GMP_HOME/lib:$MPFR_HOME/lib:$LD_LIBRARY_PATH
PATH=$MYSQL_HOME/bin:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$MYCAT_HOME/bin:$PATH
export JAVA_HOME ZOOKEEPER_HOME MYCAT_HOME CLASS_PATH MYSQL_HOME MPC_LIB_HOME GMP_HOME MPFR_HOME LD_LIBRARY_PATH PATH
(3)配置Zookeeper
首先,需要将$ZOOKEEPER_HOME/conf($ZOOKEEPER_HOME为Zookeeper的安装目录)目录下的zoo_sample.cfg文件修改为zoo.cfg文件。具体命令如下:cd /usr/local/zookeeper-3.5.5/conf/
mv zoo_sample.cfg zoo.cfg
接下来修改zoo.cfg文件,修改后的具体内容如下:tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-3.5.5/data
dataLogDir=/usr/local/zookeeper-3.5.5/dataLog
clientPort=2181
server.1=binghe151:2888:3888
server.2=binghe152:2888:3888
server.3=binghe153:2888:3888
在Zookeeper的安装目录下创建data和dataLog两个文件夹。mkdir -p /usr/local/zookeeper-3.5.5/data
mkdir -p /usr/local/zookeeper-3.5.5/dataLog
切换到新建的data目录下,创建myid文件,具体内容为数字1,如下所示:cd /usr/local/zookeeper-3.5.5/data
vim myid
将数字1写入到文件myid。
3.将Zookeeper和系统环境变量文件复制到其他服务器
注意:(1)、(2)步是在binghe151服务器上执行的。
(1)复制Zookeeper到其他服务器
根据对服务器的规划,现将Zookeeper复制到binghe152和binghe53服务器,具体执行操作如下所示:scp -r /usr/local/zookeeper-3.5.5/ binghe152:/usr/local/
scp -r /usr/local/zookeeper-3.5.5/ binghe153:/usr/local/
(2)复制系统环境变量文件到其他服务器
根据对服务器的规划,现将系统环境变量文件/etc/profile复制到binghe152、binghe153服务器,具体执行操作如下所示:scp /etc/profile binghe152:/etc/
scp /etc/profile binghe153:/etc/
上述操作可能会要求输入密码,根据提示输入密码即可。
4.修改其他服务器上的myid文件
修改binghe152服务器上Zookeeper的myid文件内容为数字2,同时修改binghe153服务器上Zookeeper的myid文件内容为数字3。具体如下:
在binghe152服务器上执行如下操作:echo "2" > /usr/local/zookeeper-3.5.5/data/myid
cat /usr/local/zookeeper-3.5.5/data/myid
2
在binghe153服务器上执行如下操作:echo "3" > /usr/local/zookeeper-3.5.5/data/myid
cat /usr/local/zookeeper-3.5.5/data/myid
3
5.使环境变量生效
分别在binghe151、binghe152、binghe153上执行如下操作,使系统环境变量生效。source /etc/profile
6.启动Zookeeper集群
分别在binghe151、binghe152、binghe153上执行如下操作,启动Zookeeper集群。zkServer.sh start
7.查看Zookeeper集群的启动状态binghe151服务器[root@binghe151 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.5.5/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: followerbinghe152服务器[root@binghe152 local]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.5.5/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leaderbinghe153服务器[root@binghe153 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.5.5/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
可以看到,binghe151和binghe153服务器上的Zookeeper角色为follower,binghe152服务器上的Zookeeper角色为leader。
初始化Mycat配置到Zookeeper集群
注意:初始化Zookeeper中的数据,是在binghe151服务器上进行的,原因是之前我们已经在binghe151服务器上安装了Mycat。
1.查看初始化脚本
在Mycat安装目录下的bin目录中提供了一个init_zk_data.sh脚本文件,如下所示。[root@binghe151 ~]# ll /usr/local/mycat/bin/
total 384
-rwxr-xr-x 1 root root 3658 Feb 26 17:10 dataMigrate.sh
-rwxr-xr-x 1 root root 1272 Feb 26 17:10 init_zk_data.sh
-rwxr-xr-x 1 root root 15701 Feb 28 20:51 mycat
-rwxr-xr-x 1 root root 2986 Feb 26 17:10 rehash.sh
-rwxr-xr-x 1 root root 2526 Feb 26 17:10 startup_nowrap.sh
-rwxr-xr-x 1 root root 140198 Feb 28 20:51 wrapper-linux-ppc-64
-rwxr-xr-x 1 root root 99401 Feb 28 20:51 wrapper-linux-x86-32
-rwxr-xr-x 1 root root 111027 Feb 28 20:51 wrapper-lin