haproxy实现mycat高可用负载均衡

1.实验架构图:

2.实验基础信息记录: 实验环境vmware虚机6台。 其中2台安装mysql,mysql做主从。 其中2台安装mycat,用来做mycat的高可用。 其中2台安装haproxy和keepalived。

主机名和IP对应如下: mycat_ha1 192.168.211.135 mycat_ha2 192.168.211.143 mycat1 192.168.211.145 mycat2 192.168.211.144 mycat_mysql1 192.168.211.147 mycat_mysql2 192.168.211.146

主机修改名称命令: hostnamectl set-hostname 主机名

具体部署过程概述:

从零开始。首先准备6个最小化安装的虚机。 然后根据自己的命名规则,命名虚机。 两台虚机安装mysql,且配置主从。这里两台虚机是mycat_mysql1和mycat_mysql2。 两台虚机安装mycat,配置。这里两台虚机是mycat1和mycat2。 两台虚机安装haproxy和keepalived,配置mycat高可用和haproxy高可用。 配置全部完成后,测试。

系统环境和软件版本: centos 7 mycat 1.6 mysql 5.7.20

注意事项: 实验环境,selinux和firewalld全部关闭状态进行的。

3.安装mysql,初始化数据库,配置连接mycat的用户和做mysql主从

以mycat_mysql1主机做示例,两台mysql虚机的安装过程是一样的,如下:

3.1 配置mysql源

我这里用mysql5.7,centos默认没有mysql5.7。需要安装mysql源。

##下载源安装包 [root@mycat_sql2 ~]# wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

[root@mycat_mysql1 ~]# rpm -ivh mysql57-community-release-el7-11.noarch.rpm warning: mysql57-community-release-el7-11.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY Preparing... ################################# [100%] Updating / installing... 1:mysql57-community-release-el7-11 ################################# [100%]

##安装完成后,见如下,多了mysql的源

3.2 用mysql源安装mysql 注意:网络不是很快,耐心点,没法子。

[root@mycat_mysql1 ~]# yum -y install mysql-server mysql-devel

3.3 mysql基础配置,设置密码配置开机启动 systemctl start mysqld.service ##启动 systemctl enable mysqld.service ##设置开机启动 systemctl status mysqld.service ##查看状态 可以看到已经启动了。 mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个临时的默认密码。

[root@mycat_mysql1 ~]# cat /var/log/mysqld.log |grep password 2018-01-02T07:46:53.390748Z 1 [Note] A temporary password is generated for root@localhost: Oe5eta)p&Zab [root@mycat_mysql1 ~]#

临时密码登录mysql后,必须先修改root密码,而且密码有规则,必须包含大小写字母数字还有符号,必须8位以上。

mysql> alter user 'root'@'localhost' identified by 'Passw0rd!'; Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)

3.4 创建一个账号,后面用来mycat连接。

mysql> grant all privileges on . to 'root'@'%' identified by 'Passw0rd!'; Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)

mysql> show grants for 'root'@'%'; +-------------------------------------------+ | Grants for root@% | +-------------------------------------------+ | GRANT ALL PRIVILEGES ON . TO 'root'@'%' | +-------------------------------------------+ 1 row in set (0.00 sec)

3.5 配置mysql的主从 这里是mycat_mysql1为主,mycat_mysql2为从 只做最基础的配置,优化之类的暂时不弄。

一些说明: 配置主从,需要打开binlog,配置server-id,设置主从间的读取日志的用户。

首先开启binlog和配置server-id

[root@mycat_mysql1 mysql]# pwd /var/lib/mysql [root@mycat_mysql1 mysql]# mkdir logs [root@mycat_mysql1 mysql]# chown mysql:mysql logs [root@mycat_mysql1 mysql]#

创建个文件夹,来存放binlog,注意这个文件夹的权限必须是mysql:mysql。

在/etc/my.cnf [mysqld]下面添加,如下:

log-bin=/var/lib/mysql/logs/mysql-bin server-id=6

注意:server-id 主从的不能一样。

设置好了重启下服务,看看binlog启动了没。

启动了。

创建主从复制的账号 #只需要在mycat_mysql1上创建,这是主

mysql> grant replication slave,replication client on . to repl@'%' identified by 'Passw0rd!'; Query OK, 0 rows affected, 1 warning (0.01 sec)

记录binlog position 记录主上面的

mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

接下来在从上面启动复制,这里是mycat_mysql2

mysql> change master to master_host='192.168.211.147', -> master_user='repl', -> master_password='Passw0rd!', -> master_log_file='mysql-bin.000001', -> master_log_pos=154; Query OK, 0 rows affected, 2 warnings (0.11 sec)

启动

mysql> start slave; Query OK, 0 rows affected (0.04 sec)

查看状态

启动成功: 主上面会启动 binlog dump线程

从上面会启动 IO SQL线程

测试下,在主上面创建个数据库:

mysql> create database test1 character set utf8; Query OK, 1 row affected (0.01 sec)

mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | logs | | mysql | | performance_schema | | sys | | test1 | +--------------------+

去从哪里看看

mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | logs | | mysql | | performance_schema | | sys | | test1 | +--------------------+

成功。 到这一步,最基础的mysql配置已经全部完成。

4.配置mycat

4.1 软件准备

只是做最简单的配置,实验环境。服务起来能达到基本架构需求即可。

mycat安装需要jdk9以上,可以去java官网下载,下载好了上传到安装mycat的虚机。如下是我下载的版本:

[root@mycat1 src]# ls jdk-9.0.1_linux-x64_bin.tar.gz Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz [root@mycat1 src]#

4.2 解压缩到目录

[root@mycat1 local]# tar -zxvf jdk-9.0.1_linux-x64_bin.tar.gz -C /usr/local

[root@mycat1 local]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

[root@mycat1 local]# pwd /usr/local [root@mycat1 local]# ls bin etc games include jdk-9.0.1 lib lib64 libexec mycat sbin share src [root@mycat1 local]#

4.3 设置java和mycat环境变量

在/etc/profile文件里最后面加入下面的配置:

export JAVA_HOME=/usr/local/jdk-9.0.1 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH

export MYCAT_HOME=/usr/local/mycat

然后执行: [root@ha1 ~]# source /etc/profile [root@ha1 ~]# java --version java 9.0.1 Java(TM) SE Runtime Environment (build 9.0.1+11) Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode) [root@ha1 ~]#

版本显示出来了,java就正常了。

[root@mycat2 src]# java --version java 9.0.1 Java(TM) SE Runtime Environment (build 9.0.1+11) Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode) [root@mycat2 src]#

4.3 创建mycat用户和群组用来运行mycat服务

[root@mycat2 ~]# groupadd mycat [root@mycat2 ~]# useradd mycat -M -g mycat [root@mycat2 ~]# chown -R mycat:mycat /usr/local/mycat/ [root@mycat2 ~]#

4.4 修改/etc/hosts文件,使得可以解析mysql节点的名称

[root@mycat2 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.211.147 mycat_mysql1 192.168.211.146 mycat_mysql2

4.5 mycat配置文件介绍

看看mycat的配置文件

[root@mycat2 mycat]# pwd /usr/local/mycat [root@mycat2 mycat]# ls bin catlet conf lib logs version.txt [root@mycat2 mycat]#

简单介绍:bin 执行文件放这里 conf 配置文件放这里 logs 日志文件放这里

基本配置只需要修改conf文件夹里的配置文件,如下:

[root@mycat2 conf]# ls autopartition-long.txt index_to_charset.properties partition-range-mod.txt sequence_distributed_conf.properties zkconf auto-sharding-long.txt log4j2.xml rule.xml sequence_time_conf.properties zkdownload auto-sharding-rang-mod.txt migrateTables.properties schema.xml server.xml cacheservice.properties myid.properties sequence_conf.properties sharding-by-enum.txt ehcache.xml partition-hash-int.txt sequence_db_conf.properties wrapper.conf

简单介绍:

schema.xml ##数据库表格 server.xml ##账号密码 rule.xml ##规则 log4j2.xml ##日志

这几个是要用的主配置文件。

等下会修改,稳妥为上,先把这几个初始文件备份一下,这个自行决定可忽略。

[root@mycat2 conf]# mv schema.xml.bk schema.xml [root@mycat2 conf]# cp schema.xml schema.xml.bk [root@mycat2 conf]# cp server.xml server.xml.bk [root@mycat2 conf]# cp rule.xml rule.xml.bk [root@mycat2 conf]# cp log4j2.xml log4j2.xml.bk

4.6 配置schema.xml

我是做简单的配置,如果要配置分库分表,参考前面几篇。

我的配置文件,参考如下:

<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="test" checkSQLschema="false" sqlMaxLimit="100"> <!-- 上面这行的意思定义一个逻辑库名称为 test--> <table name="t1" dataNode="dn1" /> <table name="t2" dataNode="dn1" /> <table name="t3" dataNode="dn1" /> <!-- 定义几个普通表格测试 -->

</schema>

<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="mycat_mysql1" database="db1" /> <!-- 定义datanode,注意datahost,database名字可自定义 -->

&lt;!-- 定义datahost,注意datahost name,balance=3是为了读写分离 数据的用户和密码是我们前面创建的 --&gt;
&lt;dataHost name="mycat_mysql1" maxCon="1000" minCon="10" balance="3"
      writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"&gt;
&lt;heartbeat&gt;select user()&lt;/heartbeat&gt;
&lt;!-- can have multi write hosts --&gt;
&lt;writeHost host="hostM1" url="192.168.211.147:3306" user="root"
           password="Passw0rd!"&gt;
&lt;/writeHost&gt;
&lt;writeHost host="hostM1" url="192.168.211.146:3306" user="root"
           password="Passw0rd!"&gt;
&lt;/writeHost&gt;

</dataHost>

</mycat:schema>

4.7 配置下server.xml 把下面选项里的默认数据库名字改成自己的就可以了

4.8 启动服务,登录看看

[root@mycat1 conf]# ../bin/mycat start Starting Mycat-server...

看看启动了没有

[root@mycat1 conf]# ps -ef |grep mycat root 2827 1 0 08:46 ? 00:00:00 /usr/local/mycat/bin/./wrapper-linux-x86-64 /usr/local/mycat/conf/wrapper.conf wrapper.syslog.ident=mycat wrapper.pidfile=/usr/local/mycat/logs/mycat.pid wrapper.daemonize=TRUE wrapper.lockfile=/var/lock/subsys/mycat root 2829 2827 6 08:46 ? 00:00:00 java -DMYCAT_HOME=. -server -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx4G -Xms1G -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/zookeeper-3.4.6.jar:lib/jline-0.9.94.jar:lib/ehcache-core-2.6.11.jar:lib/log4j-1.2.17.jar:lib/fastjson-1.2.12.jar:lib/curator-client-2.11.0.jar:lib/joda-time-2.9.3.jar:lib/log4j-slf4j-impl-2.5.jar:lib/libwrapper-linux-x86-32.so:lib/netty-3.7.0.Final.jar:lib/druid-1.0.26.jar:lib/log4j-api-2.5.jar:lib/mapdb-1.0.7.jar:lib/slf4j-api-1.6.1.jar:lib/univocity-parsers-2.2.1.jar:lib/hamcrest-core-1.3.jar:lib/Mycat-server-1.6-RELEASE.jar:lib/objenesis-1.2.jar:lib/leveldb-api-0.7.jar:lib/hamcrest-library-1.3.jar:lib/wrapper.jar:lib/commons-lang-2.6.jar:lib/reflectasm-1.03.jar:lib/mongo-java-driver-2.11.4.jar:lib/guava-19.0.jar:lib/curator-recipes-2.11.0.jar:lib/curator-framework-2.11.0.jar:lib/libwrapper-linux-ppc-64.so:lib/log4j-core-2.5.jar:lib/leveldb-0.7.jar:lib/sequoiadb-driver-1.12.jar:lib/mysql-binlog-connector-java-0.4.1.jar:lib/kryo-2.10.jar:lib/jsr305-2.0.3.jar:lib/commons-collections-3.2.1.jar:lib/disruptor-3.3.4.jar:lib/log4j-1.2-api-2.5.jar:lib/velocity-1.7.jar:lib/libwrapper-linux-x86-64.so:lib/dom4j-1.6.1.jar:lib/minlog-1.2.jar:lib/asm-4.0.jar -Dwrapper.key=iYNPXI1FIFvTaSnP -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=2827 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp io.mycat.MycatStartup start root 2841 2102 0 08:46 pts/0 00:00:00 grep --color=auto mycat

登录看看

[root@mycat1 conf]# mysql -uroot -p123456 -P8066 -h127.0.0.1 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

进来了。 注意mycat有两个口,8066和9066,9066是管理口。

登录管理口看看

[root@mycat1 conf]# mysql -uroot -p123456 -P9066 -h127.0.0.1 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (monitor)

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

可以执行命令看看,节点起来了吗

MySQL [(none)]> show @@database; +----------+ | DATABASE | +----------+ | test | +----------+ 1 row in set (0.00 sec)

MySQL [(none)]> show @@datanode; +------+------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME | +------+------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | dn1 | mycat_mysql1/db1 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | +------+------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ 1 row in set (0.01 sec)

MySQL [(none)]>

到这一步。基础mycat配置完成。 注意两台mycat虚机做一样的配置,后面用haproxy做这两台mycat的高可用。

  1. 配置haproxy,做mycat的高可用和负载均衡

5.1 haproxy的安装

直接用源安装

[root@mycat_ha1 ~]# yum -y install haproxy

主要配置文件

[root@mycat_ha1 ~]# rpm -ql haproxy /etc/haproxy /etc/haproxy/haproxy.cfg /etc/logrotate.d/haproxy /etc/sysconfig/haproxy /usr/bin/halog /usr/bin/iprange /usr/lib/systemd/system/haproxy.service /usr/sbin/haproxy /usr/sbin/haproxy-systemd-wrapper

/etc/haproxy/haproxy.cfg 这是配置文件

5.2 动手配置haproxy

先备份下配置文件吧。养成好习惯。

[root@mycat_ha2 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bk

haproxy的配置文件由两部分组成:全局设定和代理设定。分为五段:global,defaults,frontend,backend,listen.

不考虑优化,做些简单配置,global和default配置大部分可以使用默认即可。

注意: 执行haproxy服务的用户是haproxy,需要修改下文件的用户和群主。

[root@mycat_ha2 ~]# chown -R haproxy:haproxy /etc/haproxy/ [root@mycat_ha2 ~]# ll /etc |grep haproxy drwxr-xr-x 2 haproxy haproxy 47 Jan 2 09:35 haproxy [root@mycat_ha2 ~]#

配置下haproxy的日志 修改:/etc/rsyslog.conf

$ModLoad imudp $UDPServerRun 514

这两项的注释去掉

设置下haproxy.log的路径

local0.* /var/log/haproxy.log

修改:/etc/sysconfig/rsyslog

SYSLOGD_OPTIONS="-r -m 0 -c 2"

然后重启下rsyslog服务。 [root@mycat_ha2 log]# systemctl restart rsyslog.service

日志配置还有问题回头测试。

我的配置文件,参考如下:

[root@mycat_ha2 log]# cat /etc/haproxy/haproxy.cfg |grep -v "^$" |grep -v "^#" |sed '/#/d' global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode tcp log global option tcplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend mycat bind 0.0.0.0:8066 bind 0.0.0.0:9066 mode tcp log global default_backend mycat_server

backend mycat_server balance roundrobin server mycat1 192.168.211.145:8066 check inter 5s rise 2 fall 3 server mycat2 192.168.211.144:8066 check inter 5s rise 2 fall 3 server mycatadmin1 192.168.211.145:9066 check inter 5s rise 2 fall 3 server mycatadmin2 192.168.211.144:9066 check inter 5s rise 2 fall 3 listen stats mode http bind 0.0.0.0:1080 stats enable stats hide-version stats uri /haproxyadmin?stats stats realm Haproxy\ Statistics stats auth admin:admin stats admin if TRUE

5.3 启动haproxy

[root@mycat_ha2 log]# systemctl start haproxy.service

看看启动日志

Jan 2 11:34:13 mycat_ha2 systemd: Started HAProxy Load Balancer. Jan 2 11:34:13 mycat_ha2 systemd: Starting HAProxy Load Balancer... Jan 2 11:34:13 localhost haproxy[3012]: Proxy mycat started. Jan 2 11:34:13 localhost haproxy[3012]: Proxy mycat started. Jan 2 11:34:13 localhost haproxy[3012]: Proxy mycat_server started. Jan 2 11:34:13 localhost haproxy[3012]: Proxy stats started. Jan 2 11:34:13 mycat_ha2 haproxy-systemd-wrapper: [WARNING] 001/113413 (3012) : config : 'option forwardfor' ignored for frontend 'mycat' as it requires HTTP mode. Jan 2 11:34:13 mycat_ha2 haproxy-systemd-wrapper: [WARNING] 001/113413 (3012) : config : 'option forwardfor' ignored for backend 'mycat_server' as it requires HTTP mode.

报警告:是模式问题,但是如果修改成http模式直接启动不了。先忽略。

通过: http://192.168.211.143:1080/haproxyadmin?stats 访问监控页面,正常

找一台安装了mysql客户端的虚机通过haproxy虚机的地址连接测试看看:

连管理口:

连数据口

看看日志:

Jan 2 11:38:10 localhost haproxy[3013]: 192.168.211.147:60024 [02/Jan/2018:11:37:21.150] mycat mycat_server/mycat1 1/0/49239 198 -- 0/0/0/0/0 0/0 Jan 2 11:38:10 localhost haproxy[3013]: 192.168.211.147:60024 [02/Jan/2018:11:37:21.150] mycat mycat_server/mycat1 1/0/49239 198 -- 0/0/0/0/0 0/0 Jan 2 11:39:14 localhost haproxy[3013]: 192.168.211.147:60322 [02/Jan/2018:11:38:14.007] mycat mycat_server/mycat2 1/1/60013 198 cD 0/0/0/0/0 0/0 Jan 2 11:39:14 localhost haproxy[3013]: 192.168.211.147:60322 [02/Jan/2018:11:38:14.007] mycat mycat_server/mycat2 1/1/60013 198 cD 0/0/0/0/0 0/0 Jan 2 11:40:43 localhost haproxy[3013]: 192.168.211.147:60324 [02/Jan/2018:11:40:26.753] mycat mycat_server/mycatadmin1 1/1/16608 193 -- 0/0/0/0/0 0/0 Jan 2 11:40:43 localhost haproxy[3013]: 192.168.211.147:60324 [02/Jan/2018:11:40:26.753] mycat mycat_server/mycatadmin1 1/1/16608 193 -- 0/0/0/0/0 0/0

到这一步,基本需求已经实现。 但是感觉日志还是不够细致。 后面改进。

5.4 重新设置日志文件和测试mycat的高可用和负载均衡

相关文章
相关标签/搜索