Ansible模块部署mariadb主从数据库+mycat数据读写分离

主要是想体验一下ansible批量部署的感觉,
让所有操作都在ansible服务器上执行
感jio还是挺麻烦的,这次用的是几个常用模块部署,以后应该还会试着用playbook方式编写一下安装脚本

网络拓扑:
61840-zrhklhnjny.png

Ansible服务器基本设置

Ansible服务器保留服务器ssh密钥,

[root@server ansible]# ssh-copy-id root@192.168.1.17
[root@server ansible]# ssh-copy-id root@192.168.1.18
[root@server ansible]# ssh-copy-id root@192.168.1.19

05749-1qdq89xcuav.png
配置ansible主机组
91088-60xj600wq6.png

#测试主机连通性
[root@server ansible]# ansible all -m ping

#关闭所有主机的防火墙
[root@server ansible]# ansible all -m shell -a "setenforce 0"
[root@server ansible]# ansible all -m shell -a "systemctl disable firewalld && systemctl stop firewalld"

#将本机配置好的hosts文件,(yum源采用FTP路径文件),repo文件分发各主机
[root@server ansible]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts force=yes'
[root@server ansible]# ansible all -m copy -a 'src=/etc/yum.repos.d/gpmall.repo dest=/etc/yum.repos.d/gpmall.repo'

#清除系统自带yum文件,
[root@server ansible]# ansible all -m shell -a "rm -rf /etc/yum.repos.d/Cent* && yum list update"

00719-wrxpb2l00n.png
23422-368u45t1ahs.png
76356-c6f3xuy6ywl.png
46457-0jk45see5lsf.png
92614-joyp70izvv.png

Mariadb主从数据库配置

给test组主机下两台安装数据库,启动数据库

[root@server ansible]# ansible test -m yum -a 'name=mariadb,mariadb-server'
[root@server ansible]# ansible test -m service -a 'name=mariadb state=started enabled=yes'

43900-4b0dr2utvls.png
10980-roxhokdd4fe.png

#配置主从数据库的root密码,分发修改好的主从模式所需的my.cnf配置文件,重启服务
[root@server ansible]# ansible test -m shell -a 'mysqladmin -uroot password 123456'
[root@server ansible]# ansible test -m copy -a 'src=my.cnf dest=/etc/my.cnf force=yes'
[root@server ansible]# ansible test -m service -a 'name=mariadb state=restarted'

44992-otslux7ndvb.png
89708-l1eyco034sb.png
49741-4uqhq7re5xa.png

到这里我终于意识到,ansible用模块来执行命令效率堪忧,同时我的智商也十分堪忧

于是我决定将主从数据库启动所需的sql语句写进了shell脚本,
分发脚本执行完成主从设置

[root@server ansible]# cat master_db.sh 
mysql -uroot -p123456 -e"grant all privileges on *.* to root@'%' identified by '123456';"
mysql -uroot -p123456 -e"grant replication slave on *.* to 'user'@'192.168.1.18' identified by '123456';"

[root@server ansible]# cat slave_db.sh 
mysql -uroot -p123456 -e"change master to master_host='192.168.1.17',master_user='user',master_password='123456';"
mysql -uroot -p123456 -e"start slave;"
[root@server ansible]# ansible master -m copy -a 'src=master_db.sh dest=/root/run.sh mode=777' 
[root@server ansible]# ansible slave -m copy -a 'src=slave_db.sh dest=/root/run.sh mode=777' 
[root@server ansible]# ansible test -m shell -a '/root/run.sh'

42541-uk2xtzwpwmb.png
77519-00o0as45ynhn.png
62500-yd21w75reb.png

最后执行从节点状态查询,数据库主从配置完成
44804-sy7dhyqzkf.png

Mycat服务器配置

,我开始严重怀疑自己用ansible配它们的动机了,
因为,
此处mycat只有配一台服务器
完全没必要啊!!!
我决定将mycat的所有安装配置写进shell脚本,ansible分发执行的方式部署

#脚本内容:

[root@server ansible]# cat mycat.sh
#安装java wget,获取ftp服务器上的mycat源码包,解压设置权限,配置系统变量
yum -y install java-1.8.0 wget 
wget ftp://192.168.1.100/soft/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar -zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
chown -R 777 /usr/local/mycat
echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
source /etc/profile

#修改schema配置,schema库名设置为USERDB,使用数据库中的test库,将主数据库作为写数据库(192.168.1.17),将从数据库作为读数据库(192.168.1.18),设库的用户密码
cat > /usr/local/mycat/conf/schema.xml <<EOF
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="USERDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="test" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="192.168.1.17:3306" user="root" password="123456">
                        <readHost host="hostS1" url="192.168.1.18:3306" user="root" password="123456" />
                </writeHost>
        </dataHost>
</mycat:schema>
EOF

chown root:root /usr/local/mycat/conf/schema.xml

#修改server的连接用户信息,用户为root密码123456,schema库为USERDB
cat > /usr/local/mycat/conf/server.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <property name="useSqlStat">0</property>  
        <property name="useGlobleTableCheck">0</property>  
                <property name="sequnceHandlerType">2</property>
                <property name="processorBufferPoolType">0</property>
                <property name="handleDistributedTransactions">0</property>
                <property name="useOffHeapForMerge">1</property>
                <property name="memoryPageSize">1m</property>
                <property name="spillsFileBufferSize">1k</property>
                <property name="useStreamOutput">0</property>
                <property name="systemReserveMemorySize">384m</property>
                <property name="useZKSwitch">true</property>
        </system>
        <user name="root">
                <property name="password">123456</property>
                <property name="schemas">USERDB</property>
        </user>
</mycat:server>
EOF

#最后启动mycat
/bin/bash /usr/local/mycat/bin/mycat start

echo 'finish'

#分发脚本到mycat,运行即可
[root@server ansible]# ansible mycat -m copy -a 'src=mycat.sh dest=/root/install.sh mode=777' && ansible mycat -m shell -a '/root/install.sh'

09202-3mo0vr8gd0f.png

验证测试服务

Mysql 登陆到mycat服务器的8066端口
成功登陆,库使用的schema的USERDB
14681-8hm0re4w7if.png
在库中创建一个表,并写入数据
52438-8gnsyhf93w3.png

用ansible同时查询主从两台数据库的test库下的tyh表,回显表创建成功,写入数据同步
[root@server ansible]# ansible test -m shell -a ‘mysql -uroot -p123456 -e"select * from test.tyh"’
02785-zne5b9ipljg.png
主从数据库配置验证OK,mycat连接OK

Mysql 登陆到mycat服务器的9066端口
查询数据源,显示主服务器为写入W,从服务器为读取R,
主服务器WRITE_LOAD为6,从服务器READ_LOAD为4

[root@server ansible]# mysql -uroot -p123456 -h192.168.1.19 -P9066 -e'show @@datasource'
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST         | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | hostM1 | mysql | 192.168.1.17 | 3306 | W    |      0 |   10 | 1000 |     100 |         0 |          6 |
| dn1      | hostS1 | mysql | 192.168.1.18 | 3306 | R    |      0 |    6 | 1000 |      94 |         4 |          0 |
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+

04362-qpnzkd444oc.png
Mycat读写分离验证OK

[1]: