Ansible模块部署mariadb主从数据库+mycat数据读写分离
主要是想体验一下ansible批量部署的感觉,
让所有操作都在ansible服务器上执行
感jio还是挺麻烦的,这次用的是几个常用模块部署,以后应该还会试着用playbook方式编写一下安装脚本
网络拓扑:
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
配置ansible主机组
#测试主机连通性
[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"
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'
#配置主从数据库的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'
到这里我终于意识到,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'
最后执行从节点状态查询,数据库主从配置完成
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'
验证测试服务
Mysql 登陆到mycat服务器的8066端口
成功登陆,库使用的schema的USERDB
在库中创建一个表,并写入数据
用ansible同时查询主从两台数据库的test库下的tyh表,回显表创建成功,写入数据同步
[root@server ansible]# ansible test -m shell -a ‘mysql -uroot -p123456 -e"select * from test.tyh"’
主从数据库配置验证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 |
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
Mycat读写分离验证OK
[1]: