1、主从复制及主主复制的实现
主从复制
Linux:Master / Centos7.9 , Slave / Centos7.9
Mysql:Master / 5.7 ,Master / 5.7
IP:192.168.18.131192.168.18.133
主节点配置文件
[mysqld]
server-id=1 #为当前节点设置一个全局惟的ID号 log-bin #启用二进制日志 datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
从节点配置文件:
[mysqld]
server-id=2 #为当前节点设置一个全局惟的ID号(不能和主节点一样)
log-bin #启用二进制日志
read_only=ON #限制从数据库为只读,针对supper user无效
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
查看主节点当前的二进制文件名及位置:
SHOW MASTER STATUS;
centos7-bin.000002 708
在主机点上创建有复制权限的用户账号 :
GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.10.%' IDENTIFIED BY '123456';
#生产中不建议使用root账户
在从节点上使用有复制权限的用户账号连接至主服务器,并启动复制线程
CHANGE MASTER TO
MASTER_HOST='192.168.18.131',
MASTER_USER=‘root’,
MASTER_PASSWORD='123456'
MASTER_PORT=3306
MASTER_LOG_FOLE='centos-bin.000002',
MASTER_LOG_POS=708;
start slave;
查看从节点IO线程及SQL线程
show slave status \G
上面的两个进程都显示YES则表示配置成功
验证
主节点创建数据库和表
create database db1;
use db1;
create table lol(id int);
从节点查看已同步
show databases;
use db1
show tables;
主主复制
两个mysql服务器互为主从
在刚刚的主从复制环境下稍加修改即可。
131主机配置文件修改如下:
[mysqld]
server_id=1
log-bin
auto_increment_offset=1 #设置自动增长的字段的偏移量,即初始值为1
auto_increment_increment=2 #增长幅度
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
133主机配置文件修改如下:
[mysqld]
server_id=2
log-bin
auto_increment_offset=2 #设置自动增长的字段的偏移量,即初始值为2
auto_increment_increment=2 #增长幅度
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
注:其中只有server_id不同和 auto-increment- offset不同
auto-increment-increment的值应设为整个结构中服务器的总数,此次实验环境只用到两
台服务器,所以值设为2。
重启mysql使配置生效;
查看133主机当前的二进制文件名及位置,用于131主机连接时使用:
show master logs;
两个服务器上分别执行创建一个用于主从复制的账号,给与REPLICATION SLAVE权限。
131主机上文已经创建过,且133主机也已经同步,故这里不再创建;
配置连接master的相关信息
在slave中指定master相关参数,并开启slave线程;
在主从复制中133主机已经配置过相关参数,现在只需在131主机上配置即可。
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.18.133',
-> MASTER_USER='root',
-> MASTER_PASSWORD='123456',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='centos7-bin.000004', #指定133主机的二进制文件
-> MASTER_LOG_POS=154; #指定(在master二进制文件中)要开始复制的位置
mysql> start slave;
start slave;
show slave status \G
查看从节点IO线程及SQL线程状态为:YES,说明同步开启成功。
最后进行测试验证:
#在131主机执行
mysql> create table test1(id int auto_increment primary key,name char(8));
mysql> insert test1 (name) values('vn');
#在133主机执行
mysql> insert test1 (name) values('ez');
#验证
mysql> select * from test1;
+----+------+
| id | name |
+----+------+
| 1 | vn |
| 2 | ez |
+----+------+
至此,主主同步环境也已经实现!
2、xtrabackup实现全量+增量+binlog恢复库
1.下载并安装xtrabackup包
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.23/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.23-1.el7.x86_64.rpm
yum -y install percona-xtrabackup-24-2.4.23-1.el7.x86_64.rpm
2. 在原主机做完全备份到/backup
[root@centos7 ~]#mkdir /backup[root@centos7 ~]#xtrabackup -uroot -p123456 --backup --target-dir=/backup/base
目标主机无需创建/backup目录,直接复制目录本身
[root@centos7 ~]#scp -r /backup/ 目标主机:/backup1
3. 在目标主机上还原
1)预准备:确保数据一致,提交完成的事务,回滚未完成的事务
[root@centos7 ~]#xtrabackup --prepare --target-dir=/backup1/base
2)复制到数据库目录
注意:数据库目录必须为空,MySQL服务不能启动
[root@centos7 ~]#xtrabackup --copy-back --target-dir=/backup1/base
3)还原属性[root@centos7 ~]#chown -R mysql:mysql /data/mysql
4)启动服务[root@centos7 ~]#systemctl start mysqld
4.验证
可以查看到目标主机数据库已被还原:
增量+binlog还原
新增数据
第一次增量备份
[root@centos7 ~]#xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
再次新增数据
第二次增量备份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
拷贝到还原主机
[root@centos7 ~]#scp -r /backup/ 192.168.18.133:/backup/
备份过程生成三个备份目录
/backup/{base,inc1,inc2}
备份主机开始还原
1)预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务
[root@centos7 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base
2)合并第1次增量备份到完全备份
[root@centos7 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
3)合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only
[root@centos7 ~]#xtrabackup --prepare --target-dir=/backup/base --incrementaldir=/backup/inc2
4)复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
[root@centos7 ~]#xtrabackup --copy-back --target-dir=/backup/base
5)还原属性:chown-R mysql.mysql /data/mysql
6)启动服务:[root@centos7 ~]#systemctl start mysqld
验证
可以查看到目标主机数据库已被还原:
截至第二次增备的数据都已经恢复,但是第二次增备后原数据库还有可能会写入数据
第二次增备后新增数据:
这时需要用binlog来进行还原
查看二次增备后的binlog 的位置
#将二进制日志拷贝到备份主机
[root@centos7 ~]scp centos7-bin.000002 192.168.18.133:/backup/
#应用Binlog
[root@centos7 backup]# mysqlbinlog /backup/centos7-bin.000002 --start-position=1749 >/backup/binlog.sql
[root@centos7 backup]# mysql -p123456mysql>setsql_log_bin=0;#关闭Binlog
mysql>source/backup/binlog.sql
mysql>setsql_log_bin=1;#开启Binlog
验证数据
到此利用 xtrabackup+binlog的完全恢复已经完成。
3、MyCAT实现MySQL读写分离
实验拓扑:
mycat
/ \
master -- slave (主从复制)
mycat: 192.168.0.121
master: 192.168.0.120
slave: 192.168.0.122
Mycat 提供了编译好的安装包,下载地址: htt$p://dl/my$cat.io 删除$
Mycat 官方首页: htt$p://my$cat.org.cn 删除$
Index of /
../
1.6-RELEASE/ 28-Oct-2016 12:56 -
1.6.5-DEV/ 15-Jan-2017 07:10 -
2.0-dev/ 02-Jan-2017 07:24 -
mycat-web-1.0/ 02-Jan-2017 07:40 -
yum/ 18-May-2016 02:51 -
Mycat-server-1.4-beta-20150604171601-linux.tar.gz 27-Jun-2015 10:09 7663894
apache-maven-3.3.3-bin.tar.gz 27-Jun-2015 10:09 8042383
apache-tomcat-7.0.62.tar.gz 27-Jun-2015 10:09 8824528
jdk-7u79-linux-x64.tar.gz 27-Jun-2015 10:09 153512879
jdk-8u20-linux-x64.tar.gz 27-Jun-2015 10:09 160872342
phpMyAdmin-4.4.9-all-languages.tar.gz 27-Jun-2015 10:09 9352049
probe-2.3.3.zip 27-Jun-2015 10:09 7957290
toolset.sh 26-Oct-2015 05:03 16015
zookeeper-3.4.6.tar.gz
wget 一下 Mycat-server 1.6 和 jdk-7u79 两个包:
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
wget http://dl.mycat.io/jdk-7u79-linux-x64.tar.gz
[root@vm2 ~]# ll -h Mycat* jdk*
-rw-r--r-- 1 root root 147M Jun 27 2015 jdk-7u79-linux-x64.tar.gz
-rw-r--r-- 1 root root 7.4M Jun 27 2015 Mycat-server-1.4-beta-20150604171601-linux.tar.gz
Mycat-server 包解压后可直接使用。
tar -xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
其目录结构是这样的:
[root@vm2 local]# tree -L 1 mycat
mycat
|-- bin
|-- catlet
|-- conf
|-- lib
|-- logs
`-- version.txt
5 directories, 1 file
bin 目录中是可执行文件以及脚本,我们可以使用其中的 mycat 脚本控制mycat的启动和关闭。
conf 目录中是配置文件,这里配置读写分离主要使用 schema.xml 和 server.xml。其他配置分片的配置请参考官方文档。
logs 目录存放日志文件,遇到mycat出错了,就在这里查看问题的原因。
安装 jdk
mkdir /usr/java
tar -xf jdk-7u79-linux-x64.tar.gz -C /usr/java
[root@vm2 logs]# cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.7.0_79
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile.d/java.sh
[root@vm2 logs]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
完成。
这里只讲解一下读写分离用到的配置文件:server.xml, schema.xml。
前提:已经有一个配置好的 mysql 一主一从架构。
一个主从集群在Mycat里面由一个 dataNode 定义,dataNode 定义了一个数据库实例及其中的一个具体的库。Mycat 的一个数据库实例可以实际上是一个主从复制架构:一主多从,一主一从,多主多从等等,具体在 dataHost 中定义。
这里建立一个非拆分库(将mycat逻辑库绑定到一个具体的 dataNode 上)testdb,绑定到 dn1 这个 dataNode 上。
schema.xml:
<schemaname="testdb"checkSQLschema="false"sqlMaxLimit="100"dataNode="dn1">
</schema>
现在所有的表会走默认的节点 dn1。逻辑库 testdb,对应了数据节点 dn1。dn1 对应着真实的数据库实例上的一个真实的库。
<dataNodename="dn1"dataHost="vm3306"database="db1">
</dataNode>
定义数据节点,dn1,这个节点对应一个数据库实例中的一个真实的库,库名为 db1。
dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是 一个独立的数据分片。
例子中所表述的意思为:使用名字为 vm3306 数据库实例上的 db1 物理数据库,这就组成一个数据分片,最 后,我们使用名字 dn1 标识这个分片。
该属性用于定义该分片属性哪个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是:实 例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。
dataHost: 包含一个 writeHost 和 一个 readHost,它们之前已经配置好主从复制了。
balance="3":表示写请求只发给节点,读请求只发给读节点。
<dataHost name="vm3306" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.0.120:3306" user="tuser" password="guli123">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.0.122:3306" user="tuser" password="guli123"/>
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="tuser" password="guli123"/> -->
</dataHost>
user 及 password属性是后端主从mysql的账户密码信息。
dataHost属性说明:
writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
server.xml 配置:
<user name="test">
<property name="password">test</property>
<property name="schemas">testdb</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">testdb</property>
<property name="readOnly">true</property>
</user>
我们在主从 mysql 中创建测试用户 tuser,赋予增删改查,创建库和表的权限。
master:
mysql> GRANT CREATE,DELETE,INSERT,SELECT,UPDATE ON db1.* TO 'tuser'@'192.168.0.%' IDENTIFIED BY 'guli123';
启动 mycat:
cd /usr/local/mycat/bin
./mycat start
启动 mycat 遇到第一个日志报错,在 logs/wrapper.log 看到如下错误:
ERROR | wrapper | 2017/01/23 17:19:28 | JVM exited while loading the application.
INFO | jvm 5 | 2017/01/23 17:19:28 | 错误: 代理抛出异常错误: java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: vm2: vm2: 未知的名称或服务
提示说没有足够的内存来启动 Java 运行时环境,因为我用的虚拟机,给了 512M 内存,所以内存不够,重新分配了1.5G,就不会报这个错了。
启动 mycat 遇到第二个日志报错,在 logs/wrapper.log 看到如下错误:
[root@vm2 logs]# tail -f wrapper.log:
ERROR|wrapper|2017/01/2317:19:28|JVMexitedwhileloading the application.INFO|jvm5|2017/01/2317:19:28|错误:代理抛出异常错误:java.net.MalformedURLException:Localhost name unknown:java.net.UnknownHostException:vm2:vm2:未知的名称或服务
错误提示,可能没有配置好本地主机名的名称解析。
添加本地主机名解析:
[root@vm2 bin]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.121 vm2
再次尝试启动:
# ./mycat start
查看日志 wrapper.log:
INFO | jvm 1 | 2017/01/23 17:24:40 | log4j 2017-01-23 17:24:40 [./conf/log4j.xml] load completed.
INFO | jvm 1 | 2017/01/23 17:24:41 | MyCAT Server startup successfully. see logs in logs/mycat.log
显示启动成功,这次OK了。
Mycat 管理命令与监控
1. 管理命令
mysql -h127.0.0.1 -utest -ptest -P9066
MyCAT 自身有类似其他数据库的管理监控方式,可以通过 Mysql 命令行,登录管理端口(9066)执行相应 的 SQL 进行管理,也可以通过 jdbc 的方式进行远程连接管理,本小节主要讲解命令行的管理操作。
登录:目前 mycat 有两个端口,8066 数据端口,9066 管理端口,命令行的登陆是通过 9066 管理端口来操 作,登录方式类似于 mysql 的服务端登陆。
mysql -h127.0.0.1 -utest -ptest -P9066 [-dmycat]
-h 后面是主机,即当前 mycat 按照的主机地址,本地可用 127.0.0.1 远程需要远程 ip -u Mycat server.xml 中配置的逻辑库用户
-p Mycat server.xml 中配置的逻辑库密码
-P 后面是端口 默认 9066,注意 P 是大写
-d Mycat server.xml 中配置的逻辑库
数据端口与管理端口的配置端口修改:数据端口默认 8066,管理端口默认 9066 ,如果需要修改需要配置 server.xml
管理端口用于执行管理命令:
mysql -h127.0.0.1 -utest -ptest -P9066
命令端口用户执行增删改查等 SQL 语句:
mysql -h127.0.0.1 -utest -ptest -P8066
下面先看看管理端口支持的命令。
从 9066 管理端口登陆后,执行 show @@help 可以查看到所有命令:
mysql> show @@help;
+------------------------------------------+--------------------------------------------+
| STATEMENT | DESCRIPTION |
+------------------------------------------+--------------------------------------------+
| show @@time.current | Report current timestamp |
| show @@time.startup | Report startup timestamp |
| show @@version | Report Mycat Server version |
| show @@server | Report server status |
| show @@threadpool | Report threadPool status |
| show @@database | Report databases |
| show @@datanode | Report dataNodes |
| show @@datanode where schema = ? | Report dataNodes |
| show @@datasource | Report dataSources |
| show @@datasource where dataNode = ? | Report dataSources |
| show @@datasource.synstatus | Report datasource data synchronous |
| show @@datasource.syndetail where name=? | Report datasource data synchronous detail |
| show @@datasource.cluster | Report datasource galary cluster variables |
| show @@processor | Report processor status |
| show @@command | Report commands status |
| show @@connection | Report connection status |
| show @@cache | Report system cache usage |
| show @@backend | Report backend connection status |
| show @@session | Report front session details |
| show @@connection.sql | Report connection sql |
| show @@sql.execute | Report execute status |
| show @@sql.detail where id = ? | Report execute detail status |
| show @@sql | Report SQL list |
| show @@sql.high | Report Hight Frequency SQL |
| show @@sql.slow | Report slow SQL |
| show @@sql.resultset | Report BIG RESULTSET SQL |
| show @@sql.sum | Report User RW Stat |
| show @@sql.sum.user | Report User RW Stat |
| show @@sql.sum.table | Report Table RW Stat |
| show @@parser | Report parser status |
| show @@router | Report router status |
| show @@heartbeat | Report heartbeat status |
| show @@heartbeat.detail where name=? | Report heartbeat current detail |
| show @@slow where schema = ? | Report schema slow sql |
| show @@slow where datanode = ? | Report datanode slow sql |
| show @@sysparam | Report system param |
| show @@syslog limit=? | Report system mycat.log |
| show @@white | show mycat white host |
| show @@white.set=?,? | set mycat white host,[ip,user] |
| show @@directmemory=1 or 2 | show mycat direct memory usage |
| switch @@datasource name:index | Switch dataSource |
| kill @@connection id1,id2,... | Kill the specified connections |
| stop @@heartbeat name:time | Pause dataNode heartbeat |
| reload @@config | Reload basic config from file |
| reload @@config_all | Reload all config from file |
| reload @@route | Reload route config from file |
| reload @@user | Reload user config from file |
| reload @@sqlslow= | Set Slow SQL Time(ms) |
| reload @@user_stat | Reset show @@sql @@sql.sum @@sql.slow |
| rollback @@config | Rollback all config from memory |
| rollback @@route | Rollback route config from memory |
| rollback @@user | Rollback user config from memory |
| reload @@sqlstat=open | Open real-time sql stat analyzer |
| reload @@sqlstat=close | Close real-time sql stat analyzer |
| offline | Change MyCat status to OFF |
| online | Change MyCat status to ON |
| clear @@slow where schema = ? | Clear slow sql by schema |
| clear @@slow where datanode = ? | Clear slow sql by datanode |
+------------------------------------------+--------------------------------------------+
58 rows in set (0.00 sec)
查看 mycat 版本:
mysql> show @@version;
+-----------------------------------------+
| VERSION |
+-----------------------------------------+
| 5.6.29-mycat-1.6-RELEASE-20161028204710 |
+-----------------------------------------+
1 row in set (0.00 sec)
查看当前的库:
mysql> show @@database;
+----------+
| DATABASE |
+----------+
| testdb |
+----------+
1 row in set (0.00 sec)
查看 MyCAT 的数据节点的列表,对应 schema.xml 配置文件的 dataNode 节点:
mysql> show @@datanode;
+------+------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1 | vm3306/db1 | 0 | mysql | 0 | 8 | 1000 | 244 | 0 | 0 | 0 | -1 |
+------+------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
1 row in set (0.00 sec)
其中,“NAME”表示 dataNode 的名称;“dataHost”表示对应 dataHost 属性的值,即数据主机; “ACTIVE”表示活跃连接数;“IDLE”表示闲置连接数;“SIZE”对应总连接数量。
这里有 8 个空闲连接,那我们去主从节点用 netstat -ntp 命令看看建立的连接情况:
master:
[root@vm1 ~]# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.0.120:22 192.168.0.104:60060 ESTABLISHED 1492/sshd
tcp 0 0 ::ffff:192.168.0.120:3306 ::ffff:192.168.0.121:58636 ESTABLISHED 1414/mysqld
tcp 0 0 ::ffff:192.168.0.120:3306 ::ffff:192.168.0.121:58640 ESTABLISHED 1414/mysqld
tcp 0 0 ::ffff:192.168.0.120:3306 ::ffff:192.168.0.121:58582 ESTABLISHED 1414/mysqld
tcp 0 0 ::ffff:192.168.0.120:3306 ::ffff:192.168.0.121:58644 ESTABLISHED 1414/mysqld
tcp 0 0 ::ffff:192.168.0.120:3306 ::ffff:192.168.0.121:58646 ESTABLISHED 1414/mysqld
tcp 0 0 ::ffff:192.168.0.120:3306 ::ffff:192.168.0.121:58641 ESTABLISHED 1414/mysqld
tcp 0 0 ::ffff:192.168.0.120:3306 ::ffff:192.168.0.121:58635 ESTABLISHED 1414/mysqld
tcp 0 0 ::ffff:192.168.0.120:3306 ::ffff:192.168.0.121:58632 ESTABLISHED 1414/mysqld
tcp 0 0 ::ffff:192.168.0.120:3306 ::ffff:192.168.0.122:48205 ESTABLISHED 1414/mysqld
slave:
[root@vm3 ~]# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.0.122:48205 192.168.0.120:3306 ESTABLISHED 1607/mysqld
tcp 0 0 192.168.0.122:22 192.168.0.104:60102 ESTABLISHED 1196/sshd
tcp 0 0 ::ffff:192.168.0.122:3306 ::ffff:192.168.0.121:45593 ESTABLISHED 1607/mysqld
tcp 0 0 ::ffff:192.168.0.122:3306 ::ffff:192.168.0.121:45591 ESTABLISHED 1607/mysqld
tcp 0 0 ::ffff:192.168.0.122:3306 ::ffff:192.168.0.121:45583 ESTABLISHED 1607/mysqld
tcp 0 0 ::ffff:192.168.0.122:3306 ::ffff:192.168.0.121:45589 ESTABLISHED 1607/mysqld
tcp 0 0 ::ffff:192.168.0.122:3306 ::ffff:192.168.0.121:45579 ESTABLISHED 1607/mysqld
tcp 0 0 ::ffff:192.168.0.122:3306 ::ffff:192.168.0.121:45580 ESTABLISHED 1607/mysqld
tcp 0 0 ::ffff:192.168.0.122:3306 ::ffff:192.168.0.121:45588 ESTABLISHED 1607/mysqld
tcp 0 0 ::ffff:192.168.0.122:3306 ::ffff:192.168.0.121:45577 ESTABLISHED 1607/mysqld
可看到有很多从 mycat 服务器发起数据库连接(主有9个连接,从有8个连接)。
查看心跳报告:
mysql> show @@heartbeat;
+--------+-------+---------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP |
+--------+-------+---------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| hostM1 | mysql | 192.168.0.120 | 3306 | 1 | 0 | idle | 0 | 1,1,1 | 2017-01-24 06:44:38 | false |
| hostS1 | mysql | 192.168.0.122 | 3306 | 1 | 0 | idle | 0 | 1,1,1 | 2017-01-24 06:44:38 | false |
+--------+-------+---------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
2 rows in set (0.00 sec)
该命令用于报告心跳状态
RS_CODE 状态:
OK_STATUS = 1;正常状态
ERROR_STATUS = -1; 连接出错
TIMEOUT_STATUS = -2; 连接超时
INIT_STATUS = 0; 初始化状态
若节点故障,会连续默认 5 个周期检测,心跳连续失败,就会变成-1,节点故障确认,然后可能发生切换
查看 Mycat 的前端连接状态,即应用与 mycat 的连接:
mysql> show @@connection\G
*************************** 1. row ***************************
PROCESSOR: Processor0
ID: 1
HOST: 127.0.0.1
PORT: 9066
LOCAL_PORT: 50317
SCHEMA: NULL
CHARSET: latin1:8
NET_IN: 257
NET_OUT: 6343
ALIVE_TIME(S): 1264
RECV_BUFFER: 4096
SEND_QUEUE: 0
txlevel:
autocommit:
1 row in set (0.00 sec)
从上面获取到的连接 ID 属性,可以手动杀掉某个连接。
kill@@connection id,id,id
显示后端连接状态:
mysql> show @@backend\G
...
...
...
*************************** 16. row ***************************
processor: Processor0
id: 4
mysqlId: 8
host: 192.168.0.122
port: 3306
l_port: 45583
net_in: 7018
net_out: 1646
life: 6287
closed: false
borrowed: false
SEND_QUEUE: 0
schema: db1
charset: utf8:33
txlevel: 3
autocommit: true
16 rows in set (0.00 sec)
一共有16个后端连接,这里截取最后一个。
显示数据源:
mysql> show @@datasource;
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | hostM1 | mysql | 192.168.0.120 | 3306 | W | 0 | 8 | 1000 | 231 | 0 | 2 |
| dn1 | hostS1 | mysql | 192.168.0.122 | 3306 | R | 0 | 8 | 1000 | 211 | 8 | 0 |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.00 sec)
可以看到主从信息。
2. 执行SQL语句
mysql -h127.0.0.1 -utest -ptest -P8066
创建 tb1 表:
mysql> show databases;
+----------+
| DATABASE |
+----------+
| testdb |
+----------+
1 row in set (0.00 sec)
mysql> use testdb;create table tb1 (id INT, name VARCHAR(20));
Database changed
Query OK, 0 rows affected (0.25 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| tb1 |
+---------------+
1 row in set (0.01 sec)
插入两条数据:
mysql> insert into tb1 values (1, 'guli'), (2, 'xie');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
查看一下插入结果:
mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | guli |
| 2 | xie |
+------+------+
2 rows in set (0.00 sec)
没问题。
再分别到主从节点看数据插入没有:
master:
mysql> use db1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| tb1 |
+---------------+
1 row in set (0.00 sec)
mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | guli |
| 2 | xie |
+------+------+
2 rows in set (0.00 sec)
slave:
mysql> use db1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| tb1 |
+---------------+
1 row in set (0.00 sec)
mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | guli |
| 2 | xie |
+------+------+
2 rows in set (0.00 sec)
好,可以看到 OK 了。
查看刚才执行过的 sql 语句:
mysql> show @@sql;
+------+------+---------------+--------------+-------------------+
| ID | USER | START_TIME | EXECUTE_TIME | SQL |
+------+------+---------------+--------------+-------------------+
| 1 | test | 1485212346188 | 1 | select * from tb1 |
| 2 | test | 1485212040101 | 1 | select * from tb1 |
| 3 | test | 1485211834831 | 1 | select * from tb1 |
| 4 | test | 1485211803688 | 1 | select * from tb1 |
| 5 | test | 1485209518691 | 2 | select * from tb1 |
+------+------+---------------+--------------+-------------------+
5 rows in set (0.00 sec)
查看统计数据:
mysql> show @@sql.sum;
+------+------+------+------+------+------+--------+---------+--------------+--------------+---------------+
| ID | USER | R | W | R% | MAX | NET_IN | NET_OUT | TIME_COUNT | TTL_COUNT | LAST_TIME |
+------+------+------+------+------+------+--------+---------+--------------+--------------+---------------+
| 1 | test | 5 | 0 | 1.00 | 1 | 85 | 709 | [5, 0, 0, 0] | [5, 0, 0, 0] | 1485212346189 |
+------+------+------+------+------+------+--------+---------+--------------+--------------+---------------+
1 row in set (0.00 sec)
端口号: 该命令工作在 9066 端口,用来记录用户通过本地 8066 端口向 Mycat-Server 发送的 SQL 请求执行
信息。信息包括有 ID 值,执行 SQL 语句的用户名称,执行的 SQL 语句,命令执行的起始时间,命令执行消耗时间
查看慢查询语句:
设置慢查询阈值为0:reload @@sqlslow=0;
mysql> reload @@sqlslow=0;
Query OK, 1 row affected (0.00 sec)
Reset show @@sql.slow time success
在8066端口执行查询:select * from tb1;
mysql> select * from tb1;
+------+-------+
| id | name |
+------+-------+
| 1 | guli |
| 2 | xie |
| 3 | xu |
| 4 | he |
| 5 | huang |
| 6 | ma |
| 7 | liu |
| 8 | zeng |
+------+-------+
8 rows in set (0.00 sec)
在 9066 端口执行 show @@sql.slow 查看抓取的慢查询SQL语句:
mysql> show @@sql.slow;
+------+------------+---------------+--------------+-------------------+
| USER | DATASOURCE | START_TIME | EXECUTE_TIME | SQL |
+------+------------+---------------+--------------+-------------------+
| test | NULL | 1485213017329 | 1 | select * from tb1 |
+------+------------+---------------+--------------+-------------------+
1 row in set (0.00 sec)
3,如果要验证一下读写分离已经成功了,应该怎么验证呢?
使用mysql客户端连接9066管理端口,执行 show @@datasource 可以观察到 READ_LOAD,WRITE_LOAD 两个统计参数的变化:
这里显示 hostM1 为写节点,hostS1 为读节点:
hostM1 的 WRITE_LOAD = 2
hostS1 的 READ_LOAD = 12
mysql> show @@datasource;
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | hostM1 | mysql | 192.168.0.120 | 3306 | W | 0 | 8 | 1000 | 287 | 0 | 2 |
| dn1 | hostS1 | mysql | 192.168.0.122 | 3306 | R | 0 | 8 | 1000 | 271 | 12 | 0 |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.00 sec)
使用mysql客户端连接8066管理端口,执行查询,插入语句,同时使用mysql客户端连接 9066 端口观察一下读写统计参数的变化:
8066:执行查询 select * from tb1;
mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | guli |
| 2 | xie |
| 3 | xu |
| 4 | he |
+------+------+
4 rows in set (0.00 sec)
9066:
mysql> show @@datasource;
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | hostM1 | mysql | 192.168.0.120 | 3306 | W | 0 | 8 | 1000 | 308 | 0 | 2 |
| dn1 | hostS1 | mysql | 192.168.0.122 | 3306 | R | 0 | 8 | 1000 | 293 | 13 | 0 |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.00 sec)
读节点的读计数加1,
hostM1 的 WRITE_LOAD = 2
hostS1 的 READ_LOAD = 13
8066:执行插入操作 insert into tb1 values (5,'huang');
mysql>insertintotb1 values(5,'huang');
QueryOK,1row affected(0.02sec)
9066:
mysql> show @@datasource;
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | hostM1 | mysql | 192.168.0.120 | 3306 | W | 0 | 8 | 1000 | 332 | 0 | 4 |
| dn1 | hostS1 | mysql | 192.168.0.122 | 3306 | R | 0 | 8 | 1000 | 315 | 13 | 0 |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.00 sec)
写节点的读计数加2
hostM1 的 WRITE_LOAD = 2
hostS1 的 READ_LOAD = 13
由此可见读写分离是成功的。可以看到数据也成功写入数据库:
mysql> select * from tb1;
+------+-------+
| id | name |
+------+-------+
| 1 | guli |
| 2 | xie |
| 3 | xu |
| 4 | he |
| 5 | huang |
+------+-------+
5 rows in set (0.00 sec)
到此基本演示了 mycat 的主从读写分离功能,配置的前提是已经有一个配置好的 mysql 主从复制架构,mycat 工作于 mysql 主从架构的前端,负责 SQL 语句的分发。
mycat 另一个主要功能是数据分片
4、ansible常用模块介绍
Ansible常用模块
1、ping模块
2、raw模块
3、yum模块
4、apt模块
5、pip模块
6、synchronize模块
7、template模块
8、copy模块
9、user 模块与group模块
10、service 模块
11、get_url 模块
12、fetch模块
13、file模块
14、unarchive模块
15、command 模块和shell
1、ping模块
检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong
ansible 10.1.1.113 -m ping
[root@localhost ~]# ansible erp -m ping
192.168.10.6 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.10.7 | SUCCESS => {
"changed": false,
"ping": "pong"
}
2、raw模块
执行原始的命令,而不是通过模块子系统。在任何情况下,使用shell或命令模块是合适的。给定原始的参数直接通过配置的远程shell运行。可返回标准输出、错误输出和返回代码。此模块没有变更处理程序支持。
这个模块不需要远程系统上的Python,就像脚本模块一样。此模块也支持Windows目标。
- name: Bootstrap a legacy python 2.4 host
raw: yum -y install python-simplejson
- name: Bootstrap a host without python2 installed
raw: dnf install -y python2 python2-dnf libselinux-python
- name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)
raw: cat < /tmp/*txt
args:
executable: /bin/bash
- name: safely use templated variables. Always use quote filter to avoid injection issues.
raw: "{{package_mgr|quote}} {{pkg_flags|quote}} install {{python_simplejson|quote}}"
3、yum模块
这个模块是RedHat / CentOS作为远端节点的OS的时候,用的最多的。Yum是啥就不多说了,RedHat / CentOS包管理工具
使用`yum’软件包管理器管理软件包,其选项有:
– config_file:yum的配置文件 (optional)
– disable_gpg_check:关闭gpg_check (optional)
– disablerepo:不启用某个源 (optional)
– enablerepo:启用某个源(optional)
– name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
– state:状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
[root@localhost ~]# ansible test -m yum -a 'name=httpd state=latest'
[root@localhost ~]# ansible test -m yum -a 'name="@Development tools" state=present'
[root@localhost ~]# ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'
4、apt模块
这个模块是ubuntu作为远端节点的OS的时候,用的最多的。Apt是啥就不多说了,Ubuntu/Debian的包管理工具。
– deb: 用于安装远程机器上的.deb后缀的软件包(optional)
– install_recommends:这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候只下载软件包,不安装
– update_cache: 当这个参数为yes的时候等于apt-get update(optional)
– name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式
– state:状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
# 在安装foo软件包前更新然后安装foo
- apt: name=foo update_cache=yes
# 移除foo软件包
- apt: name=foo state=absent
# 安装foo软件包
- apt: name=foo state=present
# 安装foo 1.0软件包
- apt: name=foo=1.00 state=present
# 安装nginx最新的名字为squeeze-backport发布包,并且安装前执行更新
- apt: name=nginx state=latest default_release=squeeze-backports update_cache=yes
# 只下载openjdk-6-jdk最新的软件包,不安装
- apt: name=openjdk-6-jdk state=latest install_recommends=no
# 安装所有软件包到最新版本
- apt: upgrade=dist
# 更新apt-get的list
- apt: update_cache=yes
# 3600秒后停止update_cache
- apt: update_cache=yes cache_valid_time=3600
# 安装远程节点上的/tmp/mypackage.deb软件包
- apt: deb=/tmp/mypackage.deb
5、pip模块
用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements
– chdir: 执行pip命令前cd进入的目录
– name:要安装的Python库的名称或远程包的URL。
– requirements:一个pip requirements.txt文件的路径,它应该是远程系统的本地文件,如果使用chdir选项,则可以将文件指定为相对路径。
– version:指定的Python库的安装版本。
– extra_args:额外的参数传递给pip。
– executable:显式可执行文件或可执行文件的路径名,用于为系统中安装的特定版本的Python运行pip。 例如pip-3.3,如果系统中安装了Python 2.7和3.3,并且想要为Python 3.3安装运行pip。 它不能与“virtualenv”参数一起指定(在2.1中添加)。 默认情况下,它将采用适用于python解释器的版本。 pip3在python 3上,pip2或pip在python 2上。
– virtualenv:要安装到的virtualenv目录的可选路径。 它不能与’executable’参数一起指定(在2.1中添加)。 如果virtualenv不存在,则将在安装软件包之前创建它。 可选的virtualenv_site_packages,virtualenv_command和virtualenv_python选项会影响virtualenv的创建。
– virtualenv_command:用于创建虚拟环境的命令或路径名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。
– virtualenv_python:用于创建虚拟环境的Python可执行文件。 例如python3.5,python2.7。 未指定时,将使用用于运行ansible模块的Python版本。 当virtualenv_command使用pyvenv或-m venv模块时,不应使用此参数。
– state:状态(present,absent,latest, forcereinstall),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
forcereinstall:“forcereinstall”选项仅适用于可ansible 2.1及更高版本。
# 安装bottle python包。
- pip:
name: bottle
# 在0.11版安装bottle python包。
- pip:
name: bottle
version: 0.11
# 使用远程协议(bzr +,hg +,git +,svn +)安装MyApp。 您不必在extra_args中提供'-e'选项。
- pip:
name: svn+http://myrepo/svn/MyApp#egg=MyApp
# 使用远程协议(bzr +,hg +,git +)安装MyApp。
- pip:
name: git+http://myrepo/app/MyApp
# 从本地压缩包安装MyApp
- pip:
name: file:///path/to/MyApp.tar.gz
# 将bottle安装到指定的virtualenv中,继承全局安装的模块
- pip:
name: bottle
virtualenv: /my_app/venv
virtualenv_site_packages: yes
# 使用Python 2.7将bottle安装到指定的virtualenv中
- pip:
name: bottle
virtualenv: /my_app/venv
virtualenv_command: virtualenv-2.7
# 在用户主目录中安装bottle。
- pip:
name: bottle
extra_args: --user
# 安装指定的python requirements
- pip:
requirements: /my_app/requirements.txt
# 在指定的virtualenv中安装指定的python requirements。
- pip:
requirements: /my_app/requirements.txt
virtualenv: /my_app/venv
# 安装指定的python requirements和自定义pip源URL
- pip:
requirements: /my_app/requirements.txt
extra_args: -i https://example.com/pypi/simple
# 专门为Python 3.3安装bottle,使用'pip-3.3'可执行文件。
- pip:
name: bottle
executable: pip-3.3
# 安装 bottle,如果已安装,强制重新安装
- pip:
name: bottle
state: forcereinstall
6、synchronize模块
– 使用rsync同步文件,将主控方目录推送到指定节点的目录下,其参数如下:
– delete: 删除不存在的文件,delete=yes 使两边的内容一样(即以推送方为主),默认no
– src: 要同步到目的地的源主机上的路径; 路径可以是绝对的或相对的。如果路径使用"/“来结尾,则只复制目录里的内容,如果没有使用”/"来结尾,则包含目录在内的整个内容全部复制
– dest:目的地主机上将与源同步的路径; 路径可以是绝对的或相对的。
– dest_port:默认目录主机上的端口 ,默认是22,走的ssh协议。
– mode: push或pull,默认push,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件。
– rsync_opts:通过传递数组来指定其他rsync选项。
# 将控制机器上的src同步到远程主机上
- synchronize:
src: some/relative/path
dest: /some/absolute/path
# 同步传递额外的rsync选项
- synchronize:
src: /tmp/helloworld
dest: /var/www/helloworld
rsync_opts:
- "--no-motd"
- "--exclude=.git"
7、template模块
基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)
– backup: 如果原目标文件存在,则先备份目标文件
– src:在ansible控制器上的Jinja2格式化模板的路径。 这可以是相对或绝对的路径。
– dest:将模板渲染到远程机器上的位置。
force:是否强制覆盖,默认为yes
– owner:目标文件属主
– group:目标文件属组
– mode:目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)。
# Example from Ansible Playbooks
- template:
src: /mytemplates/foo.j2
dest: /etc/file.conf
owner: bin
group: wheel
mode: 0644
# 同样的例子,但使用等效于0644的符号模式
- template:
src: /mytemplates/foo.j2
dest: /etc/file.conf
owner: bin
group: wheel
mode: "u=rw,g=r,o=r"
8、copy模块
在远程主机执行复制操作文件。
– src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/“来结尾,则只复制目录里的内容,如果没有使用”/“来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
– content:用于替代"src”,可以直接设定指定文件的值
– dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
– directory_mode:递归的设定目录的权限,默认为系统默认权限
– force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
– others:所有的file模块里的选项都可以在这里使用
# Example from Ansible Playbooks
- copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: 0644
# 与上述同样的例子,但是使用等价于0644的符号模式
- copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: u=rw,g=r,o=r
# 另一个符号模式示例,添加一些权限并删除其他
- copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: u+rw,g-wx,o-rwx
9、user 模块与group模块
user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。
1、user模块
– home:指定用户的家目录,需要与createhome配合使用。
– groups:指定用户的属组。
– uid:指定用的uid。
– password:指定用户的密码。
注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
echo “123456” | openssl passwd -1 -salt $(< /dev/urandom tr -dc ‘[:alnum:]’ | head -c 32) -stdin
$14 P 4 P l F u E 4P4PlFuE4P4PlFuEur9ObJiT5iHNrb9QnjaIB0
– name:指定用户名。
– createhome:是否创建家目录 yes|no。
– system:是否为系统用户。
– remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。
– state:是创建还是删除。(present,absent)
– shell:指定用户的shell环境。
– generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。
– ssh_key_bits:可选择指定要创建的SSH密钥中的位数。
– ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。
– ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。
– ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。
# 使用bash shell添加用户“james”,将组“管理员”和“开发人员”附加到用户组
- user:
name: james
shell: /bin/bash
groups: admins,developers
append: yes
# 删除用户'johns'
- user:
name: johnd
state: absent
remove: yes
# 在~/.ssh/id_rsa中为用户jsmith创建一个2048位的SSH密钥
- user:
name: jsmith
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa
2、group模块
– gid:指定用的gid。
– name:指定用户名。
– state:是创建还是删除。(present,absent)
– system:如果是,则表示创建的组是系统组。
# Example group command from Ansible Playbooks
- group:
name: somegroup
state: present
10、service 模块
用于管理服务。
– arguments:给命令行提供一些选项
– enabled:是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。
– name:必选项,服务名称
– runlevel:运行级别
– sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
– state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
# 启动服务httpd,如果不运行
- service:
name: httpd
state: started
# 停止服务httpd,如果运行
- service:
name: httpd
state: stopped
# 启用服务httpd的示例操作,而不使用运行状态
- service:
name: httpd
enabled: yes
11、get_url 模块
该模块主要用于从http、ftp、https服务器上下载文件(类似于wget),主要有如下选项:
– sha256sum:下载完成后进行sha256 check;
– timeout:下载超时时间,默认10s
– url:下载的URL
– url_password、url_username:主要用于需要用户名密码进行验证的情况
– dest:将文件下载到哪里的绝对路径。如果dest是目录,则使用服务器提供的文件名,或者如果没有提供,将使用远程服务器上的URL的基本名称。
– headers:以格式“key:value,key:value”为请求添加自定义HTTP标头。
- name: Download foo.conf
get_url:
url: http://example.com/path/file.conf
dest: /etc/foo.conf
mode: 0440
- name: Download file with custom HTTP headers
get_url:
url: http://example.com/path/file.conf
dest: /etc/foo.conf
headers: 'key:value,key:value'
- name: Download file with check (sha256)
get_url:
url: http://example.com/path/file.conf
dest: /etc/foo.conf
checksum: sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
12、fetch模块
它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。
– src:远程系统上要获取的文件。 这必须是一个文件,而不是一个目录。 后续版本可能会支持递归提取。
– dest:保存文件的目录。 例如,如果dest目录是/backup,在主机host.example.com上命名为/ etc/profile的src文件将被保存到/backup/host.example.com/etc/profile。
– flat:允许您覆盖将目标文件添加到主机名/ path / to / file的默认行为。
# 将文件存储到/tmp/fetched/host.example.com/tmp/somefile中
- fetch:
src: /tmp/somefile
dest: /tmp/fetched
# 直接指定路径
- fetch:
src: /tmp/somefile
dest: /tmp/prefix-{{ inventory_hostname }}
flat: yes
# 指定目标路径
- fetch:
src: /tmp/uniquefile
dest: /tmp/special/
flat: yes
13、file模块
file模块主要用于远程主机上的文件操作,file模块包含如下选项:
– force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
– group:定义文件/目录的属组
– mode:定义文件/目录的权限
– owner:定义文件/目录的属主
– path:必选项,定义文件/目录的路径
– recurse:递归的设置文件的属性,只对目录有效
– src:要被链接的源文件的路径,只应用于state=link的情况
– dest:被链接到的路径,只应用于state=link的情况
– state:
directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
# 更改文件所有权,组和模式。 当使用八进制数指定模式时,第一个数字应始终为0。
- file:
path: /etc/foo.conf
owner: foo
group: foo
mode: 0644
# touch创建文件,使用符号模式设置权限(相当于0644)
- file:
path: /etc/foo.conf
state: touch
mode: "u=rw,g=r,o=r"
# touch创建文件,添加/删除一些权限
- file:
path: /etc/foo.conf
state: touch
mode: "u+rw,g-wx,o-rwx"
# 创建一个目录,如果它不存在
- file:
path: /etc/some_directory
state: directory
mode: 0755
14、unarchive模块
用于解压文件,模块包含如下选项:
– copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。
– creates:指定一个文件名,当该文件存在时,则解压指令不执行
– dest:远程主机上的一个路径,即文件解压的绝对路径。
– group:解压后的目录或文件的属组
– list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项
– mode:解压后文件的权限
– src:如果copy为yes,则需要指定压缩文件的源路径
– owner:解压后文件或目录的属主
- name: 将foo.tgz解压缩到/var/lib/foo中
unarchive:
src: foo.tgz
dest: /var/lib/foo
- name: 解压远程计算机上已存在的文件
unarchive:
src: /tmp/foo.zip
dest: /usr/local/bin
remote_src: yes
- name: 解压文档需要下载的文件(2.0中添加)
unarchive:
src: https://example.com/example.zip
dest: /usr/local/bin
remote_src: yes
15、command 模块和shell
用于在各被管理节点运行指定的命令
shell和command的区别:shell模块可以特殊字符,而command是不支持
1、command模块
– chdir:在运行命令之前,切换到此目录。
- name: return motd to registered var
command: cat /etc/motd
register: mymotd
- name: Run the command if the specified file does not exist.
command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database
# 您还可以使用“args”表单提供选项。
- name: This command will change the working directory to somedir/ and will only run when /path/to/database doesn't exist.
command: /usr/bin/make_database.sh arg1 arg2
args:
chdir: somedir/
creates: /path/to/database
2、shell模块
– chdir:在运行命令之前,切换到此目录。
– executable:更改用于执行命令的shell(bash,sh)。 应该是可执行文件的绝对路径。
- name: Execute the command in remote shell; stdout goes to the specified file on the remote.
shell: somescript.sh >> somelog.txt
- name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)
shell: cat < /tmp/*txt
args:
executable: /bin/bash