Ansible 自动化运维工具部署主从数据库+读写分离

文章目录

  • Ansible 自动化运维工具部署主从数据库+读写分离
    • 一、主从复制和读写分离介绍
    • 二、准备工作
      • (1)节点规划
      • (2)修改主机名
      • (3)免密
      • (4)配置IP映射
      • (5)安装ansible
      • (6)配置主机清单文件
    • 三、目录结构
      • (1)创建项目目录
      • (2)创建角色目录
      • (3)创建变量目录
      • (4)init角色
      • (5)编写剧本入口文件
    • 四、编写角色任务文件
      • (1)init初始化任务文件
      • (2)mysql-master任务文件
      • (3)mysql-slave任务文件
      • (4)mysql-create-testdb任务文件
      • (5)mycat任务文件
    • 五、执行playbook
    • 六、验证主从复制读写分离
      • (1)登录mycat管理窗口
      • (2)读写分离验证

Ansible 自动化运维工具部署主从数据库+读写分离

一、主从复制和读写分离介绍

数据库主从复制是一种常见的数据库架构,用于提高数据库的可用性、可扩展性和性能。它通过将写操作(主节点)复制到一个或多个从节点来实现数据的同步。

主从复制的工作原理如下:

  1. 首先,将一个数据库节点指定为主节点,所有的写操作都在主节点上执行。
  2. 主节点将写操作记录到二进制日志(binary log)中,并将这些日志发送到从节点。
  3. 从节点接收到二进制日志后,将其应用到自己的数据库上,实现数据的同步。

读写分离是基于主从复制的,核心思想是将读操作分发到多个从节点上,而将写操作集中在主节点上。Mycat是一个开源的数据库中间件,支持读写分离,将读操作和写操作分别分发到不同的数据库节点上

二、准备工作

(1)节点规划

准备三台服务器,centos7.9.2009

IP节点
192.168.100.10ansible
192.168.100.20master
192.168.100.30slave
192.168.100.40mycat

(2)修改主机名

1. 修改主机名
# ansible节点
[root@localhost ~]# hostnamectl set-hostname ansible
[root@localhost ~]# bash
[root@ansible ~]#
# master节点
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# bash
[root@master ~]#
# slave节点
[root@localhost ~]# hostnamectl set-hostname slave
[root@localhost ~]# bash
[root@slave ~]#
# mycat节点
[root@localhost ~]# hostnamectl set-hostname mycat
[root@localhost ~]# bash
[root@mycat ~]# 

(3)免密

[root@ansible ~]# ssh-keygen
[root@master ~]# ssh-keygen
[root@slave ~]# ssh-keygen
[root@mycat ~]# ssh-keygen[root@ansible ~]# ssh-copy-id 192.168.100.20
[root@ansible ~]# ssh-copy-id 192.168.100.30
[root@ansible ~]# ssh-copy-id 192.168.100.40

(4)配置IP映射

[root@ansible ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.10 ansible
192.168.100.20 master
192.168.100.30 slave
192.168.100.40 mycat

(5)安装ansible

[root@ansible ~]# yum install -y epel-release vim tree
[root@ansible ~]# yum install -y ansible 
[root@ansible ~]# ansible --version
ansible 2.9.27config file = /etc/ansible/ansible.cfgconfigured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']ansible python module location = /usr/lib/python2.7/site-packages/ansibleexecutable location = /usr/bin/ansiblepython version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

(6)配置主机清单文件

[root@ansible ~]# vim /etc/ansible/hosts 
[master]
192.168.100.20
[slave]
192.168.100.30
[mycat]
192.168.100.40[root@ansible ~]# ansible all -m ping
192.168.100.30 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
192.168.100.20 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"

三、目录结构

(1)创建项目目录

[root@ansible ~]# mkdir mycat_mariadb
[root@ansible ~]# cd mycat_mariadb/

(2)创建角色目录

在创建roles之前,我们将数据库读写分离部署的步骤分为 3个role执行,这样更加易懂

init(初始化)

mysql(主从复制)

mycat(读写分离)

[root@ansible mycat_mariadb]# mkdir -p  roles/{mysql-master,mysql-slave,init,mycat,mysql-create-testdb}/{templates,tasks,files} 

这次项目中会用到template、tasks、files目录,可以选择性创建,自己用到哪个创建哪个

(3)创建变量目录

创建该目录用来存放变量

[root@ansible mycat_mariadb]# mkdir group_vars
[root@ansible mycat_mariadb]# vim group_vars/all
PASSWD: '000000'
master_host: 192.168.100.20
slave_host: 192.168.100.30
mycat_host: 192.168.100.40
shujuku: testdb

(4)init角色

这一步操作是用来创建数据库主从复制,以及读写分离的配置文件

master-my.cnf.j2文件内容

[root@ansible mycat_mariadb]# vim roles/mysql-master/files/master-my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
server-id=20
log_bin = mysql-bin
binlog-ignore-db=mysql
binlog-do-db=testdb
binlog_format=STATEMENT
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

slave-my.cnf.j2 文件内容

[root@ansible mycat_mariadb]# vim roles/mysql-slave/files/slave-my.cnf[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemdserver_id=30
relay-log=mysql-relay
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

server.xml.j2 文件内容

[root@ansible mycat_mariadb]# vim roles/mycat/templates/server.xml.j2 
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/"><system><property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 --><property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 --><property name="sequnceHandlerType">2</property><!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议--><!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号--><!-- <property name="processorBufferChunk">40960</property> --><!-- <property name="processors">1</property> <property name="processorExecutor">32</property> --><!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena--><property name="processorBufferPoolType">0</property><!--默认是65535 64K 用于sql解析时最大文本长度 --><!--<property name="maxStringLiteralLength">65535</property>--><!--<property name="sequnceHandlerType">0</property>--><!--<property name="backSocketNoDelay">1</property>--><!--<property name="frontSocketNoDelay">1</property>--><!--<property name="processorExecutor">16</property>--><!--<property name="serverPort">8066</property> <property name="managerPort">9066</property> <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> --><!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志--><property name="handleDistributedTransactions">0</property><!--off heap for merge/order/group/limit      1开启   0关闭--><property name="useOffHeapForMerge">1</property><!--单位为m--><property name="memoryPageSize">1m</property><!--单位为k--><property name="spillsFileBufferSize">1k</property><property name="useStreamOutput">0</property><!--单位为m--><property name="systemReserveMemorySize">384m</property><!--是否采用zookeeper协调切换  --><property name="useZKSwitch">true</property></system><!-- 全局SQL防火墙设置 --><!-- <firewall> <whitehost><host host="127.0.0.1" user="mycat"/><host host="127.0.0.2" user="mycat"/></whitehost><blacklist check="false"></blacklist></firewall>--><user name="root"><property name="password">{{PASSWD}}</property><property name="schemas">TESTDB</property><!-- 表级 DML 权限设置 --><!-- <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges>--></user><user name="user"><property name="password">{{PASSWD}}</property><property name="schemas">TESTDB</property><property name="readOnly">true</property></user></mycat:server>

schema.xml.j2 文件内容

[root@ansible mycat_mariadb]# vim roles/mycat/templates/schema.xml.j2 <?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><dataNode name="dn1" dataHost="host1" database="{{shujuku}}" /><dataHost name="host1" maxCon="1000" minCon="10" balance="3"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="{{master_host}}:3306" user="root"password="{{PASSWD}}"><readHost host="hostS1" url="{{slave_host}}:3306" user="root" password="{{PASSWD}}" /></writeHost></dataHost>
</mycat:schema>

(5)编写剧本入口文件

将调用roles的顺序及哪些主机调用哪些roles在这个文件夹中体现出来

[root@ansible mycat_mariadb]# vim mycat_mariadb.yaml 
- hosts: allremote_user: rootroles:- init- hosts: masterremote_user: rootroles:- mysql-master- hosts: slaveremote_user: rootroles:- mysql-slave- hosts: mycatremote_user: rootroles:- mycat

四、编写角色任务文件

(1)init初始化任务文件

[root@ansible tasks]# vim /root/mycat_mariadb/roles/init/tasks/main.yaml - name: 配置所有主机的host映射copy: src=/etc/hosts dest=/etc/hosts- name: 关闭防火墙shell: systemctl stop firewalld && systemctl disable firewalld && setenforce 0- name: 安装mariadb expectshell: yum install -y mariadb-server expect- name: 设置开机自启并开启mariadbshell: systemctl enable mariadb --now- name: 设置密码shell: mysqladmin -uroot password '{{PASSWD}}'- name: 安装MySQL-pythonshell: yum install -y MySQL-python

(2)mysql-master任务文件

[root@ansible tasks]# vim /root/mycat_mariadb/roles/mysql-master/tasks/main.yaml - name: 移动文件copy: src=master-my.cnf dest=/etc/my.cnf- name: 重新启动mariadbshell: systemctl restart mariadb- name: 设置root用户访问权限shell: mysql -uroot -p{{PASSWD}} -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '{{PASSWD}}';flush privileges;"- name: 创建数据库用户用于复制shell: mysql -uroot -p{{PASSWD}} -e "grant replication slave on *.* to 'csq'@'192.168.100.%' identified by '{{PASSWD}}';"- name: 存放变量Log_nameshell: mysql -uroot -p{{PASSWD}} -e "show master status;"|awk 'NR==2{print $1}'register: file
- name: 存放变量File_sizeshell: mysql -uroot -p{{PASSWD}} -e "show master status;"|awk 'NR==2{print $2}'register: pot- name: 设置全局变量set_fact: masterbin={{ file.stdout_lines[0] }}   
- name: 设置全局变量set_fact: position={{ pot.stdout_lines[0] }}  

(3)mysql-slave任务文件

[root@ansible mycat_mariadb]# vim roles/mysql-slave/tasks/main.yaml- name: 移动文件copy: src=slave-my.cnf  dest=/etc/my.cnf
- name: 重启mariadbshell: systemctl restart mariadb- name: 设置root用户访问权限shell: mysql -uroot -p{{PASSWD}} -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '{{PASSWD}}';flush privileges;"- name: 设置主数据信息mysql_replication:login_user: rootlogin_password: '000000'mode: changemastermaster_user: csqmaster_password: '000000'master_host: 192.168.100.20master_log_file: "{{ hostvars['192.168.100.20']['masterbin'] }}"master_log_pos: "{{ hostvars['192.168.100.20']['position'] }}"- name: 开启slaveshell: mysql -uroot -p{{PASSWD}} -e "start slave;"  - name: 定义输出的信息shell: mysql -uroot -p{{PASSWD}} -e "show slave status\G;" | grep -E "Slave_IO_Running|Slave_SQL_Running"register: slave_status_output
- name: 打印输出的信息debug:var: slave_status_output.stdout

(4)mysql-create-testdb任务文件

[root@ansible mycat_mariadb]# vim roles/mysql-create-testdb/tasks/main.yaml
- name: 创建用于复制的testdb库shell: mysql -uroot -p000000 -e "create database testdb;"
- name: 创建表插入数据shell: mysql -uroot -p000000 -e "use testdb; create table mytbl(id int,name varchar(20));insert into mytbl values(1,'csq');"

(5)mycat任务文件

[root@ansible mycat_mariadb]# vim roles/mycat/tasks/main.yaml- name: 设置root用户访问权限shell: mysql -uroot -p{{PASSWD}} -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '{{PASSWD}}';flush privileges;"- name: 安装openjdkshell: yum install -y java-1.8.0-openjdk  java-1.8.0-openjdk-devel wget net-tools- name: 下载Mycat软件包shell: wget http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz- name: 解压Mycat软件包到/usr/localshell:  tar -zxvf /root/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/- name: 复制模板文件template: src=schema.xml.j2 dest=/usr/local/mycat/conf/schema.xml- name: 复制模板文件template: src=server.xml.j2 dest=/usr/local/mycat/conf/server.xml- name: 开启mycatshell: /bin/bash /usr/local/mycat/bin/mycat start

五、执行playbook

[root@ansible mycat_mariadb]# ansible-playbook mycat_mariadb.yaml     PLAY [all] ************************************************************************************************************************************************************TASK [Gathering Facts] ************************************************************************************************************************************************
ok: [192.168.100.40]
ok: [192.168.100.30]
ok: [192.168.100.20]TASK [init : 配置所有主机的host映射] *******************************************************************************************************************************************
changed: [192.168.100.40]
changed: [192.168.100.20]
changed: [192.168.100.30]TASK [init : 关闭防火墙] ***************************************************************************************************************************************************
changed: [192.168.100.40]
changed: [192.168.100.30]
changed: [192.168.100.20]TASK [init : 安装mariadb expect] ****************************************************************************************************************************************
[WARNING]: Consider using the yum module rather than running 'yum'.  If you need to use command because yum is insufficient you can add 'warn: false' to this command
task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [192.168.100.40]
changed: [192.168.100.30]
changed: [192.168.100.20]TASK [init : 设置开机自启并开启mariadb] ****************************************************************************************************************************************
changed: [192.168.100.30]
changed: [192.168.100.40]
changed: [192.168.100.20]TASK [init : 设置密码] ****************************************************************************************************************************************************
changed: [192.168.100.30]
changed: [192.168.100.20]
changed: [192.168.100.40]TASK [init : 安装MySQL-python] ******************************************************************************************************************************************
changed: [192.168.100.40]
changed: [192.168.100.30]
changed: [192.168.100.20]PLAY [master] *********************************************************************************************************************************************************TASK [Gathering Facts] ************************************************************************************************************************************************
ok: [192.168.100.20]TASK [mysql-master : 移动文件] ********************************************************************************************************************************************
changed: [192.168.100.20]TASK [mysql-master : 重新启动mariadb] *************************************************************************************************************************************
changed: [192.168.100.20]TASK [mysql-master : 设置root用户访问权限] ************************************************************************************************************************************
changed: [192.168.100.20]TASK [mysql-master : 创建数据库用户用于复制] *************************************************************************************************************************************
changed: [192.168.100.20]TASK [mysql-master : 存放变量Log_name] ************************************************************************************************************************************
changed: [192.168.100.20]TASK [mysql-master : 存放变量File_size] ***********************************************************************************************************************************
changed: [192.168.100.20]TASK [mysql-master : 设置全局变量] ******************************************************************************************************************************************
ok: [192.168.100.20]TASK [mysql-master : 设置全局变量] ******************************************************************************************************************************************
ok: [192.168.100.20]PLAY [slave] **********************************************************************************************************************************************************TASK [Gathering Facts] ************************************************************************************************************************************************
ok: [192.168.100.30]TASK [mysql-slave : 移动文件] *********************************************************************************************************************************************
changed: [192.168.100.30]TASK [mysql-slave : 重启mariadb] ****************************************************************************************************************************************
changed: [192.168.100.30]TASK [mysql-slave : 设置root用户访问权限] *************************************************************************************************************************************
changed: [192.168.100.30]TASK [mysql-slave : 设置主数据信息] ******************************************************************************************************************************************
changed: [192.168.100.30]TASK [mysql-slave : 开启slave] ******************************************************************************************************************************************
changed: [192.168.100.30]TASK [mysql-slave : 定义输出的信息] ******************************************************************************************************************************************
changed: [192.168.100.30]TASK [mysql-slave : 打印输出的信息] ******************************************************************************************************************************************
ok: [192.168.100.30] => {"slave_status_output.stdout": "             Slave_IO_Running: Yes\n            Slave_SQL_Running: Yes"
}PLAY [master] *********************************************************************************************************************************************************TASK [Gathering Facts] ************************************************************************************************************************************************
ok: [192.168.100.20]TASK [mysql-create-testdb : 创建用于复制的testdb库] ***************************************************************************************************************************
changed: [192.168.100.20]TASK [mysql-create-testdb : 创建表插入数据] **********************************************************************************************************************************
changed: [192.168.100.20]PLAY [mycat] **********************************************************************************************************************************************************TASK [Gathering Facts] ************************************************************************************************************************************************
ok: [192.168.100.40]TASK [mycat : 设置root用户访问权限] *******************************************************************************************************************************************
changed: [192.168.100.40]TASK [mycat : 安装openjdk] **********************************************************************************************************************************************
changed: [192.168.100.40]TASK [mycat : 下载Mycat软件包] *********************************************************************************************************************************************
[WARNING]: Consider using the get_url or uri module rather than running 'wget'.  If you need to use command because get_url or uri is insufficient you can add 'warn:
false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [192.168.100.40]TASK [mycat : 解压Mycat软件包到/usr/local] **********************************************************************************************************************************
[WARNING]: Consider using the unarchive module rather than running 'tar'.  If you need to use command because unarchive is insufficient you can add 'warn: false' to
this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [192.168.100.40]TASK [mycat : 复制模板文件] *************************************************************************************************************************************************
changed: [192.168.100.40]TASK [mycat : 复制模板文件] *************************************************************************************************************************************************
changed: [192.168.100.40]TASK [开启mycat] ********************************************************************************************************************************************************
changed: [192.168.100.40]PLAY RECAP ************************************************************************************************************************************************************
192.168.100.20             : ok=19   changed=14   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.30             : ok=15   changed=12   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.100.40             : ok=15   changed=13   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

在执行过程中会打印出这两条信息,如果都是YES 说明你主从配置成功了

image-20230913151908678

六、验证主从复制读写分离

(1)登录mycat管理窗口

[root@mycat ~]# mysql -uroot -p000000 -h127.0.0.1 -P 9066

查看读写配置情况

MySQL [(none)]> show @@datasource;
+----------+--------+-------+----------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST           | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+----------------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | hostM1 | mysql | 192.168.100.20 | 3306 | W    |      0 |   10 | 1000 |      57 |         0 |          1 |
| dn1      | hostS1 | mysql | 192.168.100.30 | 3306 | R    |      0 |    5 | 1000 |      53 |         2 |          0 |
+----------+--------+-------+----------------+------+------+--------+------+------+---------+-----------+------------+
参数详解:
DATANODE:数据节点的名称
NAME:数据节点的标识名称
TYPE:数据节点的类型,这里是mysql
HOST:数据节点的主机地址
PORT:数据节点的端口号
W/R:数据节点的读写类型,W表示写入,R表示读取
ACTIVE:当前活跃连接数
IDLE:当前空闲连接数
ZE:连接池大小,即连接池中的最大连接数
EXECUTE:执行次数,表示该数据节点的执行操作次数
READ_LOAD:读取负载,表示该数据节点的读取负载情况

查看心跳信息

MySQL [(none)]> show @@heartbeat;
+--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME   | TYPE  | HOST           | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME    | STOP  |
+--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| hostM1 | mysql | 192.168.100.20 | 3306 |       1 |     0 | idle   |       0 | 1,1,1        | 2023-09-13 15:27:30 | false |
| hostS1 | mysql | 192.168.100.30 | 3306 |       1 |     0 | idle   |       0 | 1,0,1        | 2023-09-13 15:27:30 | false |
+--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
参数详解:
NAME:心跳节点的名称
TYPE:心跳节点的类型,这里是mysql
HOST:心跳节点的主机地址
PORT:心跳节点的端口号
RS_CODE:复制状态码,用于判断复制是否正常进行 (1表示主从复制正常进行)
RETRY:重试次数,表示心跳节点尝试重连的次数
STATUS:心跳节点的状态,包括idle(空闲)和active(活跃)
TIMEOUT:超时时间,表示心跳节点的超时时间
EXECUTE_TIME:执行时间,表示心跳节点的执行时间
LAST_ACTIVE_TIME:最后活跃时间,表示心跳节点最后一次发送心跳的时间

(2)读写分离验证

[root@mycat ~]# mysql -uroot -p000000 -h127.0.0.1 -P 8066
MySQL [(none)]> use TESTDB;
MySQL [TESTDB]> insert into mytbl values(1,@@hostname); # 插入数据
MySQL [TESTDB]> select * from mytbl; # 查询数据,自动跳转从主机进行查询
+------+-------+
| id   | name  |
+------+-------+
|    1 | csq   |
|    1 | slave |
+------+-------+
# @@hostname是MySQL系统变量,表示当前数据库服务器的主机名。
# 由此可以推断,select * from mytbl;查询的是从库。

使用master节点访问一下

[root@master ~]# mysql -uroot -p000000 -e "use testdb;select * from mytbl;"
+------+--------+
| id   | name   |
+------+--------+
|    1 | csq    |
|    1 | master |

使用slave节点访问一下

[root@slave ~]# mysql -uroot -p000000 -e "use testdb;select * from mytbl;"
+------+-------+
| id   | name  |
+------+-------+
|    1 | csq   |
|    1 | slave |
+------+-------+

至此 Ansible部署主从数据库+读写分离结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【案例】--EasyExcel解析文件案例

目录 一、前言二、EasyExcel解析文件2.1、EasyExcel选型2.2、如何存储excel解析的文件2.3、解析格式规则的excel文件2.4、解析未知格式规则的excel文件一、前言 最近项目中,需要对excel、csv等文件进行解析,并做相关的业务功能。在实际业务中,遇到不少难题: (1)、excel、c…

Postman应用——下载注册和登录

文章目录 下载安装注册登录注册账号登录账号 下载安装 Postman下载&#xff1a;https://www.postman.com/ 访问链接后&#xff0c;进入首页&#xff0c;根据自己的操作系统下载对应的版本。 找到下载到的目录直接双击.exe文件&#xff0c;会默认安装在C盘&#xff0c;安装完会…

系统架构设计师(第二版)学习笔记----信息系统基础

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----信息系统基础 文章目录 一、信息系统概述1.1 信息系统的5个基本功能1.2 信息系统发展阶段1.3 初始阶段的主要特点1.4 传播阶段的主要特点1.5 控制阶段的主要特点1.6 集成阶段的主要特点1.7 信息系统的种类…

【Unity3D】UI Toolkit数据动态绑定

1 前言 本文将实现 cvs 表格数据与 UI Toolkit 元素的动态绑定。 如果读者对 UI Toolkit 不是太了解&#xff0c;可以参考以下内容。 UI Toolkit简介UI Toolkit容器UI Toolkit元素UI Toolkit样式选择器UI Toolkit自定义元素 本文完整资源见→UI Toolkit数据动态绑定。 2 数据…

无涯教程-JavaScript - COMBINA函数

描述 COMBINA函数返回给定数量的项目的组合数量(重复)。 语法 COMBINA (number, number_chosen)争论 Argument描述Required/OptionalNumber 必须大于或等于0,并且大于或等于Number_chosen。 非整数值将被截断。 RequiredNumber_chosen 必须大于或等于0。 非整数值将被截断。…

脚本:python绘制七夕爱心

文章目录 效果脚本Reference 效果 脚本 import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 640 # 画布的宽 CANVAS_HEIGHT 640 # 画布的高 CANVAS_CENTER_X CANVAS_WIDTH / 2 # 画布中心的X轴坐标 CANVAS_CENTER_Y CANVAS_HEIGHT /…

搭建Android自动化python+appium环境

一. 需要软件 JDK:JAVA安装后配置JDK环境 SDK:SDK下载后配置adb环境 Python:pyhton语言 Pycharm:python脚本编译工具 Appium-python-client:pyhton中的库 Appium客户端 二. 搭建步骤 1.配置JDK环境 ①. 下载安装java: https://www.oracle.com/java/technologies/java…

SEO优化排名的技巧与注意点(百度SEO排名的五大注意点)

关键词排名是指在搜索引擎中&#xff0c;用户搜索相关关键词时&#xff0c;网站出现的顺序。SEO优化是提高网站排名的一种方法。优化关键词排名的目的是提高网站流量和知名度。但是要注意遵循百度SEO排名的规则。 下面介绍一下百度SEO排名的五大注意点和优化关键词的六种方式。…

本地事务与分布式事务

目录 一、本地事务 1、事务的基本性质 2、事务的隔离级别 3、事务的传播行为 4、SpringBoot 事务关键点 二、分布式事务 1、为什么有分布式事务 2、CAP 定理与 BASE 理论 3、分布式事务几种方案 一、本地事务 1、事务的基本性质 数据库事务的几个特性&#xff1a;原…

管理类联考——数学——汇总篇——知识点突破——代数——等差数列

⛲️ 一、考点讲解 1.定义 如果在数列{ a n a_n an​}中&#xff0c; a n 1 − a n d a_{n1}-a_nd an1​−an​d&#xff08;常数&#xff09; &#xff08; n ∈ N &#xff0b; &#xff09; &#xff08;n∈N_&#xff0b;&#xff09; &#xff08;n∈N&#xff0b;​&a…

欧科云链研究院:锚定金融市场,香港从STO再出发

作者&#xff5c;Hedy Bi 昨日&#xff0c;据大公报报道&#xff0c;太极资本宣布推出香港首个面向「专业投资者」的房地产基金证券型代币发行&#xff08;STO&#xff09;。集资目标为1亿元。“牌照&#xff0c;醉翁之意不在酒。BTC、ETH等加密资产只是第一步&#xff0c;而背…

pgsql操作json类型

目录 一、表结构 二、实体类 三、json处理器 四、配置文件 五、josn数据 1、插入 2、查找 一、表结构 CREATE TABLE "public"."pg_user" ("id" int8 NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 MINVALUE 1 MAXVALUE 92233720…

Dinky上路之旅

1、部署flink集群 1.1、flink-conf.yaml cat > flink-conf.yaml << EOF jobmanager.rpc.address: boshi-146 jobmanager.rpc.port: 6123 jobmanager.bind-host: 0.0.0.0 jobmanager.memory.process.size: 1600m taskmanager.bind-host: 0.0.0.0 # 修改为本机ip tas…

C++系列赋值运算符重载

赋值运算符重载 类的默认函数拷贝构造函数和赋值运算符 重载赋值运算符相关注意事项 类的默认函数 一个类至少有4个默认函数&#xff1a; 默认构造函数拷贝构造函数析构函数赋值运算符重载函数 拷贝构造函数和赋值运算符 拷贝构造函数是在创建类的时候调用的&#xff0c;之…

c++八股day2-虚函数表和虚函数表指针的创建时机

虚函数表和虚函数表指针的创建时机。 背景&#xff1a;用来实现多态&#xff08;包括静态多态和动态多态&#xff09;&#xff0c;多态的原理就是虚函数表和虚函数表指针 虚函数表的创建时机&#xff1a; a.什么时候生成的&#xff1f;编译器编译的时候声生成的&#xff0c;…

第二篇------Virtual I/O Device (VIRTIO) Version 1.1

上篇文章&#xff1a;https://blog.csdn.net/Phoenix_zxk/article/details/132917657 篇幅太大&#xff0c;所以分开写&#xff0c;接下来续上 4.3.3.2.1 设备要求&#xff1a;Guest->Host 通知 设备必须忽略 GPR2 的位 0-31&#xff08;从左边数&#xff09;。这样可以使…

高阶数据结构(2)-----红黑树(未完成)

一)红黑树的基本概念和基本性质: 1)红黑树就是一种高度平衡的二叉搜索树&#xff0c;但是在每一个节点上面都增加了一个存储位来表示结点的颜色&#xff0c;可以是红色或者是黑色&#xff0c;通过对任何一条从根节点到叶子节点上面的路径各个节点着色方式的限制&#xff0c;红黑…

做品牌定位,品牌三问是什么?

中小企业起步阶段打造品牌之前&#xff0c;一定要问自己三个问题&#xff0c;分别是&#xff1a; 一、你是什么&#xff1a;解决品类认知的问题&#xff1b; 二、有何不同&#xff1a;解决差异化定位问题&#xff1b; 三、何以见得&#xff1a;解决顾客信任感问题。 这就是…

交叉编译工具链-Ubuntu 安装说明

交叉编译工具链-Ubuntu 安装说明 【实验目的】 了解交叉编译工具链的安装方法与使用方法 【实验环境】 1、 ubuntu 14.04 发行版 【注意事项】 1、实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 1、安装交叉编译工具链 在 ubuntu 下打开一个终端并进入到家…

如何在控制台显示MyBatis的SQL语句

对于application.properties文件&#xff0c;添加以下配置&#xff1a; # 开启 MyBatis SQL日志输出 logging.level.org.mybatisdebug# 输出格式化的 SQL语句 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl# 配置数据库方言 # MySQL方言 mybati…