mycat读写分离和ansible模块使用,redis编译安装
- 1、MyCAT中间件服务实现读写分离
- 2、ansible常用模块总结
- 3、ansible-playbook批量安装httpd,按主机名提供不同的index.html(如node1的index.html欢迎页面为welcome node1)
- 4、编译安装redis
1、MyCAT中间件服务实现读写分离
- 原理:Mycat首先会创建一个代理数据库,默认名字是TESTDB,客户端连接的也是这个数据库,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
流程图
Mycat的特性:
1、支持前端作为MySQL通用代理
2、后端JDBC方式支持Oracle,DB2,SQL Server,mongodb,巨杉
3、基于心跳的自动故障切换,支持读写分离
4、支持MySQL Cluster,Galera,Percona,cluster集群
5、支持数据的多片自动路由与聚合
6、支持sum,count,max等常用的聚合函数,支持跨库分页
7、支持库内分表,支持单库内部任意join全局表,支持跨库2表join
8、基于caltlet的多表join
9、支持通过全局表,ER关系的分片策略,实现了高效的多表join查询
读写分离配置:
环境搭建:
系统版本 | Centos7.8 |
mysql版本 | 5.6.51 |
mycat版本 | 1.6.7 |
主mysql | 192.168.116.145 |
从mysql | 192.168.116.146 |
mycat服务器 | 192.168.116.130 |
客户端 | 192.168.116.131 |
- 主从环境部署数据库
主从原理介绍:主从原理
主从数据库版本的yum源
vi /etc/yum.repos.d/mysql.repo
[mysql]
name=mysql5.6
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.6-community-el6-x86_64/
gpgcheck=0
yum install mysql-community-server -y 主从都安装相同版本的数据库
- 主mysql配置
vi /etc/my.cnf
[mysqld]
server-id=1
log-bin
general_log=ON #开启这个是为了检验读写功能,实际使用可以不加
general_log_file=/var/log/mysql/general.log #开启这个是为了检验读写功能,实际使用可以不加
mkdir /var/log/mysql -p 创建通用日志目录
chown mysql.mysql /var/log/mysql 授权通用日志目录权限
systemctl start mysqld 启动服务
mysql命令行配置
show master logs; 确认创建账户前二进制进度
grant replication slave on *.* to aa@'%' identified by 'aa1234'; 创建主从账户
grant all on *.* to mycat@'%' identified by 'aa1234'; 创建mycat的账户
create database mycat; 创建mycat代理的真实数据库mycat
- 从mysql配置
vi /etc/my.cnf
[mysqld]
server-id=2
log-bin
general_log=ON #开启这个是为了检验读写功能,实际使用可以不加
general_log_file=/var/log/mysql/general.log #开启这个是为了检验读写功能,实际使用可以不加
mkdir /var/log/mysql -p 创建通用日志目录
chown mysql.mysql /var/log/mysql 授权通用日志目录权限
systemctl start mysqld 启动服务
mysql命令行配置:
CHANGE MASTER TO
MASTER_HOST='192.168.116.145',
MASTER_USER='aa',
MASTER_PASSWORD='aa1234',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysqld-bin.000001',
MASTER_LOG_POS=120;
start slave; 启动主从配置
show slave status\G 确认主从成功
- mycat服务器配置:
安装Java环境
yum install -y java
下载mycat包
wget http://dl.mycat.org.cn/1.6.7.5/2021-6-16/Mycat-server-1.6.7.5-release-20210616151418-linux.tar.gz
解压压缩包到目录下
tar xf Mycat-server-1.6.7.5-release-20210616151418-linux.tar.gz -C /usr/local/
将目录下的工具定义到本地变量
echo 'PATH=/usr/local/mycat/bin:$PATH' >/etc/profile.d/mycat.sh
source /etc/profile.d/mycat.sh
ss -tnl 确认端口启动,服务正常运行
vi /usr/local/mycat/conf/server.xml 查看mycat默认配置文件
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
TESTDB 是mycat的生成的代理数据库
root TESTDB代理数据库的账户
123456 TESTDB代理数据库的密码
mycat进行读写分离服务的配置
vi /usr/local/mycat/conf/schema.xml
#删除文件其他内容,只保留这些
<?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="localhost1" database="mycat" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="host1" url="192.168.116.145:3306" user="mycat" password="aa1234">
<readHost host="host2" url="192.168.116.146:3306" user="mycat" password="aa1234"/>
</writeHost>
</dataHost>
</mycat:schema>
mycat restart 重启mycat使读写分离生效
- 客户端测试和主从数据库查看通用日志
默认mycat会生成一个代理数据库,这个数据库只是代理作用,跟真实的主从mysql数据库没关系
mysql -uroot -p123456 -h192.168.116.130 -P8066 连接代理数据库
show databases; 默认只有TESTDB数据库,没有其他数据库
use TESTDB; 进入代理的数据库中,实际就是进入到上面主数据库新建的mycat这个数据库了
create table aa(id int,name char(5)); 新建表格
insert aa(id,name)values(1,'aa'); 插入数据,进行写操作
select * from aa; 查看数据,进行读操作
- 主数据库查看通用日志
tail -F /var/log/mysql/general.log 可以看到插入数据成功
select user() 心跳配置,每隔10秒mycat就查询后台数据库,判断数据库的up/down
- 从数据库查看通用日志
tail -F /var/log/mysql/general.log
其中这个是主数据库复制过来从数据库的,所以有下面这个写操作
BEGIN
insert aa(id,name)values(1,'aa')
COMMIT /* implicit, from Xid_log_event */
select * from aa 查询表格时,只有从数据库有记录,主数据库没记录,这就说明读写分离成功
2、ansible常用模块总结
基本介绍:
- ansible官网:ansible
- 安装方式:yum install -y ansible
- ansible主配置文件:/etc/ansible/ansible.cfg
- ansible控制节点的配置文件:/etc/ansible/hosts
环境:
系统版本 | Centos7.8 |
ansible控制节点 | 192.168.116.145 |
被控制节点1 | 192.168.116.146 |
被控制节点2 | 192.168.116.147 |
ansible控制服务器配置:
ansible是通过免密码登录节点进行控制的,需要分发秘钥
ssh-keygen 一直回车就行
ssh-copy-id 192.168.116.146 分发秘钥给节点1
ssh-copy-id 192.168.116.147 分发秘钥给节点2
编辑文件,设置需要控制的节点
vi /etc/ansible/hosts 最后一行添加
[node]
192.168.116.146
192.168.116.147
- ping模块:
ansible all -m ping 确认主机联通性
all代表全部主机
-m表示指定模块名字
2. shell 系统命令模块:
ansible all -m shell -a 'ifconfig ens33' 使用shell命令返回内容
-a '': 指定传输的参数内容
3. copy 复制模块:
将ansible控制服务器的文件分发给节点
ansible node -m copy -a 'src=/etc/hosts dest=/root/etc.hosts owner=root group=root mode=600'
node 为/etc/ansible/hosts 定义的节点组名
-m copy 指定使用copy模块
-a '' 指定参数
src=/etc/hosts ansible控制服务器的文件
dest=/root/etc.hosts 目标节点生成的文件
owner=root 节点新生成文件的属主
group=root 节点新生成文件的属组
mode=600 节点新生成文件的权限
ansible node -m shell -a 'ls -l /root' 确认分发文件成功
- fetch 拉取节点文件模块
从节点拉取文件到控制服务器上,只能拉取文件,不能拉取目录
ansible all -m fetch -a 'src=/etc/hosts dest=/root/'
ll /root 本地确认拉取成功
- file 文件管理模块
对节点新建文件夹
ansible all -m file -a 'path=/root/test state=directory owner=root group=root mode=700'
对节点新建文件,不设置文件属性,默认就是root
ansible all -m file -a 'path=/root/test/test.txt state=touch'
ansible all -m shell -a 'ls -l /root/test' 确认文件生成
ansible all -m file -a 'dest=/root/test/test.txt state=absent' 删除节点的文件
ansible all -m shell -a 'ls -l /root/test' 确认文件被删除
- yum 服务安装模块
ansible all -m yum -a 'name=httpd' 安装服务,多个服务中间用逗号隔开
- service 服务管理模块
ansible all -m service -a ‘name=httpd state=started enabled=yes’ 对安装的服务进行开启,开机启动 - group 用户组管理模块
ansible all -m group -a 'name=aa gid=1011' 对节点新建用户组aa
- user 用户管理模块
ansible all -m user -a 'name=aa comment="test" uid=1011 home=/home/aa group=aa' 新建用户aa
注意:用户组需要先创建才能创建用户
ansible all -m user -a 'name=aa state=absent remove=yes' 删除用户及其家目录
其他模块有:cron计划任务模块,script脚本文件使用模块,setup系统信息输出模块等
3、ansible-playbook批量安装httpd,按主机名提供不同的index.html(如node1的index.html欢迎页面为welcome node1)
节点配置:
节点1配置主机名:
hostnamectl set-hostname node1
节点2配置主机名:
hostnamectl set-hostname node2
ansible控制服务器配置:
mkdir /ansible/{xml,conf} -p 创建配置目录
cd /ansible
vi conf/index.html 创建网站主页文件,添加下面内容
{{ ansible_hostname }} # 这个变量是setup模块定义的主机名模块,直接可以调用
vi xml/httpd.xml 创建xml文件,注意空格和对齐
- hosts: node
remote_user: root
tasks:
- name: install httpd
yum: name=httpd
- name: copy index.html
template: src=/ansible/conf/index.html dest=/var/www/html/index.html owner=apache group=apache mode=644
- name: start httpd
service: name=httpd state=started enabled=yes
ansible-playbook -C httpd.xml 检查xml文件语法是否正确
ansible-playbook httpd.xml 对节点开始配置
ansible控制器进行检查节点是否配置成功
ansible all -m shell -a 'cat /var/www/html/index.html' 查看网页文件内容
curl 192.168.116.146 访问节点1网站
curl 192.168.116.147 访问节点2网站
4、编译安装redis
redis官网:redis官网 redis版本下载:redis
Redis 特性 :
- 速度快: 10W QPS(并发),基于内存,C语言实现
- 单线程,6.0版本以前都是单线程
- 键值匹配,数据可持久化
- 支持多种数据结构
- 支持多种编程语言
- 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
- 代码短小精悍,开发容易,不依赖外部库,使用简单
- 支持主从复制
- 支持高可用和分布式
编译步骤:
yum install -y gcc jemalloc-devel 安装依赖包和环境
wget https://download.redis.io/releases/redis-5.0.7.tar.gz 下载源码包
tar xf redis-5.0.7.tar.gz 解压压缩包
cd redis-5.0.7 进入目录
make PREFIX=/usr/local/redis install 编译并安装到目录下
将redis的工具定义到本地变量
echo 'PATH=/usr/local/redis/bin:$PATH' > /etc/profile.d/redis.sh
source /etc/profile.d/redis.sh
创建redis的配置目录及其他目录
mkdir /usr/local/redis/{etc,log,data,run} -p
将源码包的配置文件复制到安装目录下
cp redis.conf /usr/local/redis/etc/
创建redis账户
useradd -r -s /sbin/nologin redis
把redis安装的目录及子目录权限设置为redis
chown redis.redis -R /usr/local/redis
添加redis服务到systemd守护进程,设置开机启动
vi /usr/lib/systemd/system/redis.service
#添加下面内容
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
ExecReload=/bin/kill -s QUIT $MAINPID;/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf --supervised systemd
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
systemctl daemon-reload 重新加载systemd配置文件
systemctl start redis 启动redis
systemctl enable redis 开启开机自启redis
redis-cli 进入交互界面
set a 1 新增键和值
get a 获取值,确认编译完成