M63-第十二周作业

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • 一、主从复制及主主复制的实现1、主从复制主节点:[root@centOS8 ~]# yum -y install ...
    小霍吖阅读 560评论 0 0
  • 1、主从复制及主主复制的实现 主从复制 完成主设备配置 完成从设备配置 主主复制:在主从复制的基础上 首先,调整主...
    yabao11阅读 333评论 0 0
  • 1、ansible-playbook实现MySQL的二进制部署 1.1 安装ansible # yum -y in...
    布格雷斯阅读 329评论 1 0
  • 1、 导入hellodb.sql生成数据库 (1) 在students表中,查询年龄大于25岁,且为男性的同学的名...
    布格雷斯阅读 269评论 1 0
  • 1、在阿里云服务器搭建openv-p-n(有条件的同学再做) 2、通过编译、二进制安装MySQL5.7 编译安装 ...
    布格雷斯阅读 342评论 1 0