十三

沉淀自我,厚积薄发。

0%

实现基于文件验证的vsftpd虚拟用户

一、创建用户数据库文件

1
2
3
4
5
6
7
8
9
10
11
12
13
#创建帐号密码
[101]$ vim /etc/vsftpd/vusers.txt
wang #帐号
123 #密码
chen #帐号
123 #密码

[101]$ cd /etc/vsftpd/
#从这个文件输出成db格式的数据库文件
[101]$ db_load -T -t hash -f vusers.txt vusers.db

#为了安全可以加这句
[101]$ chmod 600 vusers.db

二、创建用户和访问FTP目录

1
2
3
4
5
6
7
8
#创建用户,指定家目录
[101]$ useradd -d /data/ftproot -s /sbin/nologin test
#给他的家目录权限rw
[101]$ chmod a=rx /data/ftproot/
#创建子目录,用来上传下载
[101]$ mkdir /data/ftproot/upload
#设置有rwx权限给子目录
[101]$ setfacl -m u:test:rwx /data/ftproot/upload

三、创建pam配置文件

1
2
3
4
5

[101]$ vim /etc/pam.d/vsftpd.db
#写这2行,数据库路径不加后缀
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers

四、指定pam配置文件

1
2
3
4
5
6
7
[101]$ vim /etc/vsftpd/vsftpd.conf
#所有的用户都映射成下面那条写的用户
guest_enable=YES
#对,就是我,映射成我
guest_username=test
#数据库文件路径(相对)
pam_service_name=vsftpd.db

五、SELinux设置:

  1. 禁用SELinux
    或者
  2. setsebool -P ftpd_full_access 1

六、虚拟用户建立独立的配置文件

  1. 创建配置文件存放的路径

    1
    mdkir /etc/vsftpd/vusers.d/ 
  2. 修改配置

    1
    2
    3
    vim /etc/vsftpd/vsftpd.conf
    #添加这句
    user_config_dir=/etc/vsftpd/vusers.d/
  3. 进入此目录

    1
    cd /etc/vsftpd/vusers.d/ 
  4. 允许wang用户可读写,其它用户只读

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vim wang 
    #创建wang的配置文件
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES

    vim chen
    #创建chen的配置文件
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    local_root=/data/chen #登录目录改变至指定的目录
  5. 重启服务

    1
    systemctl restart vsftpd

实验:实现基于MYSQL验证的vsftpd虚拟用户

说明:本实验在两台CentOS主机上实现,一台做为FTP服务器,一台做数据库服务器

MariaDB服务器: 192.168.99.103

1. 安装所需要包和包组:

  1. 在数据库服务器上安装
    1
    2
    3
    [103]$ yum –y install mariadb-server
    [103]$ systemctl start mariadb.service
    [103]$ systemctl enable mariadb

2. 在数据库服务器上创建虚拟用户账号
1.建立存储虚拟用户数据库和连接的数据库用户

1
2
mysql> CREATE DATABASE vsftpd;
mysql> SHOW DATABASES;
  1. ftp服务和mysql不在同一主机:

    1
    mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'%' IDENTIFIED BY '123';
  2. ftp服务和mysql在同一主机:

    1
    2
    mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'%' IDENTIFIED BY '123';
    mysql> FLUSH PRIVILEGES;
  3. 准备相关表

    1
    2
    3
    4
    5
    6
    7
    8
    mysql> USE vsftpd;
    Mysql> SHOW TABLES;
    mysql> CREATE TABLE users (
    id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    name CHAR(50) BINARY NOT NULL,
    password CHAR(48) BINARY NOT NULL
    );
    mysql> DESC users;
  4. 测试连接

    1
    2
    3
    [101]$ mysql -uvsftpd -h192.168.99.103 -p123
    mysql> SHOW DATABASES;
    mysql> quit
  5. 添加虚拟用户

    1
    2
    3
    4
    5
    6
    7
    [103]$ mysql 
    #根据需要添加所需要的用户,为了安全应该使用PASSWORD函数加密其密码后存储
    mysql> USE vsftpd;
    mysql> DESC users;
    mysql> INSERT INTO users(name,password) values('wang',password('123'));
    mysql> INSERT INTO users(name,password) values('chen',password('123'));
    mysql> SELECT * FROM users;
vsftp服务器: 192.168.99.101

一、 安装pam_mysql

  1. 编译安装,先安装环境

    1
    [101]$ yum -y install  gcc gcc-c++ mariadb-devel pam-devel vsftpd
  2. 下载pam_mysql-0.7RC1.tar.gz

    1
    [101]$ wget ftp://192.168.99.1/Magedu37/files/sources/pam_mysql-0.7RC1.tar.gz
  3. 解压

    1
    [101]$ tar xf pam_mysql-0.7RC1.tar.gz
  4. 安装

    1
    2
    3
    [101]$ cd pam_mysql-0.7RC1/
    [101]$ ./configure --with-pam-mods-dir=/lib64/security
    [101]$ make && make install

二、 在FTP服务器上配置vsftpd服务

  1. 在FTP服务器上建立pam认证所需文件
    1
    2
    3
    4
    [101]$ vi /etc/pam.d/vsftpd.mysql 
    #添加如下两行
    auth required pam_mysql.so user=vsftpd passwd=123 host=192.168.99.103 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
    account required pam_mysql.so user=vsftpd passwd=123 host=192.168.99.103 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
    注意:参考README文档,选择正确的加密方式
    crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示使用mysql password()函数加密,3表示md5加密,4表示sha1加密
配置字段 说明
auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so 模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
user=vsftpd 为登录mysql的用户
passwd=magedu 登录mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密
  1. 建立相应用户和修改vsftpd配置文件,使其适应mysql认证
    建立虚拟用户映射的系统用户及对应的目录

    1
    2
    3
    4
    [101]$ useradd -s /sbin/nologin -d /data/ftproot vuser
    [101]$ chmod 555 /data/ftproot #centos7需除去ftp根目录的写权限
    [101]$ mkdir /data/ftproot/{upload,pub}
    [101]$ setfacl -m u:vuser:rwx /data/ftproot/upload
  2. 修改配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    vim /etc/vsftpd/vsftpd.conf
    #确保中已经启用了以下选项
    anonymous_enable=YES

    #添加下面两项
    guest_enable=YES
    guest_username=vuser

    #修改下面一项,大约126行。
    pam_service_name=vsftpd.mysql
  3. 启动vsftpd服务

    1
    systemctl start vsftpd
  4. 设置开机启动

    1
    2
    chkconfig vsftpd on
    systemctl enable vsftpd
  5. 查看端口开启情况

    1
    2
    3
    netstat -tnlp |grep 21
    #或
    ss -tnlp | grep 21

三、 Selinux相关设置:在FTP服务器上执行
没有开启可跳过

1
2
3
4
restorecon -R /lib64/security
setsebool -P ftpd_connect_db 1
setsebool -P ftp_home_dir 1
chcon -R -t public_content_rw_t /var/ftproot/

四、 测试:利用FTP客户端工具,以虚拟用户登录验证结果

  1. 在vsftp服务器上
    1
    tail  -f /var/log/secure
  2. 测试的客户端上
    1
    2
    yum -y install ftp
    ftp 192.168.99.101
  3. 连接上了
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [102]$ ftp 192.168.99.101
    Connected to 192.168.99.101 (192.168.99.101).
    220 (vsFTPd 3.0.2)
    Name (192.168.99.101:root): chen
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> ls
    227 Entering Passive Mode (192,168,99,101,182,64).
    150 Here comes the directory listing.
    drwxr-xr-x 2 0 0 6 Jul 28 07:49 pub
    drwxrwxr-x 2 0 0 6 Jul 28 07:49 upload
    226 Directory send OK.
    ftp>
  4. 101主机上(vsftp服务器)也有了日志
    1
    2
    Jul 28 15:54:04 localhost polkitd[5380]: Registered Authentication Agent for unix-process:13770:75587 (system bus name :1.96 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
    Jul 28 15:54:04 localhost polkitd[5380]: Unregistered Authentication Agent for unix-process:13770:75587 (system bus name :1.96, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)

五、 在FTP服务器上配置虚拟用户具有不同的访问权限
这个就跟实现基于文件验证的vsftpd虚拟用户一样了,

  1. 配置vsftpd为虚拟用户使用配置文件目录

    1
    2
    3
    [101]$ vim /etc/vsftpd/vsftpd.conf
    #在最后添加如下选项
    user_config_dir=/etc/vsftpd/vsftpd.d
  2. 创建所需要目录,并为虚拟用户提供配置文件

    1
    2
    3
    [101]$ mkdir /etc/vsftpd/vsftpd.d
    [101]$ cd /etc/vsftpd/vsftpd.d
    [101]$ touch wang chen
  3. 配置虚拟用户的访问权限
    虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户wang具有上传文件的权限,可修改/etc/vsftpd/vusers_config/wang文件,在里面添加如下选项并设置为YES即可,只读则设为NO
    注意:需确保对应的映射用户对于文件系统有写权限

    1
    2
    3
    4
    [101]$ vim /etc/vsftpd/vusers_config/wang
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
  4. 给另一个用户给配置下

    1
    2
    3
    4
    5
    [101]$ vim /etc/vsftpd/vusers_config/chen
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    local_root=/data/ftproot2 #登录目录改变至指定的目录
  5. 给他创建个upload目录用来上传

    1
    2
    mkdir -p /data/ftproot2/upload
    setfacl -m u:vuser:rwx /data/ftproot2/upload
客户端:192.168.99.110
测试成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[110]$ ftp 192.168.99.101
Connected to 192.168.99.101 (192.168.99.101).
220 (vsFTPd 3.0.2)
Name (192.168.99.101:root): chen
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,99,101,60,128).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jul 28 08:09 111111
drwxr-xr-x 2 0 0 6 Jul 28 07:49 pub
drwxrwxr-x 2 0 0 6 Jul 28 07:49 upload
226 Directory send OK.
ftp> quit
221 Goodbye.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[110]$ ftp 192.168.99.101
Connected to 192.168.99.101 (192.168.99.101).
220 (vsFTPd 3.0.2)
Name (192.168.99.101:root): chen
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,99,101,82,253).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jul 28 08:09 222222
drwxrwxr-x 2 0 0 6 Jul 28 08:07 upload
226 Directory send OK.
ftp> quit
221 Goodbye.

实验:实现NFS服务

NFS服务:192.168.99.101
  1. 安装NFS
    1
    yum -y install nfs-utils
  2. 启动服务
    1
    2
    systemctl start nfs-server
    systemctl enable nfs-server
  3. 创建用来提供服务的目录
    1
    mkdir /nfsshare
  4. 给权限
    1
    chown nfsnobody /nfsshare
  5. 修改NFS配置
    1
    2
    [101]$ vim /etc/exports
    /nfsshare desktopX(rw)
  6. 加载配置
    1
    exporfs –r
客户端:192.168.99.102
  1. 创建目录,一会来挂载
    1
    mkdir /mnt/nfsshare
  2. 挂载
    1
    mount serverX:/nfsshare /mnt/nfsshare

下面是开机自动挂载
3. 修改

1
2
[101]$ vim /etc/fstab
nfsserver:/nfsshare /mnt/nfsshare nfs defaults 0 0
  1. 自动读取配置挂载
    1
    mount -a

实验环境

8台虚拟机

  1. 192.168.99.108:图形界面的
  2. 192.168.99.101:powerDNS
  3. 192.168.99.102~3:web布署wordpress
  4. 192.168.99.104:NFS服务器
  5. 192.168.99.105~7:mysql主从半同步复制

106~108:mysql主从半同步复制

主机:192.168.99.106~108

106~108主机上都安装

  1. 直接yum安装吧
    1
    yum -y install mariadb-server
  2. 启动
    1
    2
    systemctl start mariadb
    systemctl enable mariadb
主服务器:192.168.99.106
  1. 修改配置文件

    1
    2
    3
    4
    5
    vim /etc/my.cnf
    [mysqld]
    #加这2条
    server_id=106
    log_bin
  2. 重启服务

    1
    systemctl restart mariadb
  3. 创建帐号用于复制

    1
    2
    3
    [105]$ mysql

    MariaDB [(none)]> grant replication slave on *.* to repluser@'%' identified by '123';
从服务器1:192.168.99.107
  1. 修改配置文件

    1
    2
    3
    4
    [107]$ vim /etc/my.cnf
    [mysqld]
    server_id=107
    read_only
  2. 重启服务

    1
    [107]$ systemctl restart mariadb
  3. 连接到主服务器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [107]$ mysql

    MariaDB [(none)]> change master to
    master_host='192.168.99.106',
    master_user='repluser',
    master_password='123',
    master_port=3306,
    master_log_file='mariadb-bin.000001',
    master_log_pos=0;
  4. 启动slave

    1
    MariaDB [(none)]> start slave ;
  5. 查看是否连接上

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    MariaDB [(none)]> show slave status\G;
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 192.168.99.105
    Master_User: repluser
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mariadb-bin.000001
    Read_Master_Log_Pos: 386
    Relay_Log_File: mariadb-relay-bin.000002
    Relay_Log_Pos: 672
    Relay_Master_Log_File: mariadb-bin.000001
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Replicate_Do_DB:
    Replicate_Ignore_DB:
    Replicate_Do_Table:
    Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
    Replicate_Wild_Ignore_Table:
    Last_Errno: 0
    Last_Error:
    Skip_Counter: 0
    Exec_Master_Log_Pos: 386
    Relay_Log_Space: 968
    Until_Condition: None
    Until_Log_File:
    Until_Log_Pos: 0
    Master_SSL_Allowed: No
    Master_SSL_CA_File:
    Master_SSL_CA_Path:
    Master_SSL_Cert:
    Master_SSL_Cipher:
    Master_SSL_Key:
    Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
    Last_IO_Errno: 0
    Last_IO_Error:
    Last_SQL_Errno: 0
    Last_SQL_Error:
    Replicate_Ignore_Server_Ids:
    Master_Server_Id: 1
从服务器2:192.168.99.108
  1. 修改配置文件

    1
    2
    3
    4
    [108]$ vim /etc/my.cnf
    [mysqld]
    server_id=3
    read_only
  2. 重启服务

    1
    [108]$ systemctl restart mariadb
  3. 连接到主服务器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [108]$ mysql

    MariaDB [(none)]> change master to
    master_host='192.168.99.106',
    master_user='repluser',
    master_password='123',
    master_port=3306,
    master_log_file='mariadb-bin.000001',
    master_log_pos=0;
  4. 启动slave

    1
    MariaDB [(none)]> start slave ;
  5. 查看是否启动成功

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    MariaDB [(none)]> show slave status\G;
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 192.168.99.101
    Master_User: repluser
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mariadb-bin.000001
    Read_Master_Log_Pos: 386
    Relay_Log_File: mariadb-relay-bin.000002
    Relay_Log_Pos: 672
    Relay_Master_Log_File: mariadb-bin.000001
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Replicate_Do_DB:
    Replicate_Ignore_DB:
    Replicate_Do_Table:
    Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
    Replicate_Wild_Ignore_Table:
    Last_Errno: 0
    Last_Error:
    Skip_Counter: 0
    Exec_Master_Log_Pos: 386
    Relay_Log_Space: 968
    Until_Condition: None
    Until_Log_File:
    Until_Log_Pos: 0
    Master_SSL_Allowed: No
    Master_SSL_CA_File:
    Master_SSL_CA_Path:
    Master_SSL_Cert:
    Master_SSL_Cipher:
    Master_SSL_Key:
    Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
    Last_IO_Errno: 0
    Last_IO_Error:
    Last_SQL_Errno: 0
    Last_SQL_Error:
    Replicate_Ignore_Server_Ids:
    Master_Server_Id: 1
主服务器:192.168.99.106
  1. 在主服务器上安装主服务器的插件

    1
    MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  2. 查看安装的插件

    1
    2
    3
    4
    MariaDB [(none)]> show plugins;
    ...
    | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
    +--------------------------------+----------+--------------------+--------------------+---------+
  3. 查看下这个插件的状态,并没有启动,enabled为OFF

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MariaDB [(none)]> show global variables like '%semi%';
    +------------------------------------+-------+
    | Variable_name | Value |
    +------------------------------------+-------+
    | rpl_semi_sync_master_enabled | OFF |
    | rpl_semi_sync_master_timeout | 10000 |
    | rpl_semi_sync_master_trace_level | 32 |
    | rpl_semi_sync_master_wait_no_slave | ON |
    +------------------------------------+-------+
    #其中:timeout这个参数是指同步超时时间
  4. 启用这个插件

    1
    MariaDB [(none)]> set global rpl_semi_sync_master_enabled=on;
  5. 查看下,是不是启用了

    1
    2
    3
    4
    5
    6
    MariaDB [(none)]> show global variables like '%semi%';
    +------------------------------------+-------+
    | Variable_name | Value |
    +------------------------------------+-------+
    | rpl_semi_sync_master_enabled | ON |
    ...
从服务器1:192.168.99.107
  1. 从服务器安装的插件不太一样,看

    1
    MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  2. 查看安装的插件

    1
    2
    3
    MariaDB [(none)]> show plugins;
    | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
    +--------------------------------+----------+--------------------+-------------------+---------+
  3. 查看下这个插件的状态,并没有启动,enabled为OFF

    1
    2
    3
    4
    5
    6
    7
    MariaDB [(none)]> show global variables like '%semi%';
    +---------------------------------+-------+
    | Variable_name | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled | OFF |
    | rpl_semi_sync_slave_trace_level | 32 |
    +---------------------------------+-------+
  4. 启用它

    1
    MariaDB [(none)]> set global rpl_semi_sync_slave_enabled=on;
  5. 看,启动了

    1
    2
    3
    4
    5
    6
    7
    MariaDB [(none)]> show global variables like '%semi%';
    +---------------------------------+-------+
    | Variable_name | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled | ON |
    | rpl_semi_sync_slave_trace_level | 32 |
    +---------------------------------+-------+
  6. 设置完还得重启线程

    1
    2
    3
    MariaDB [(none)]> stop slave; 

    MariaDB [(none)]> start slave;
从服务器2:192.168.99.108
  1. 跟107一样

    1
    MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  2. 查看安装的插件

    1
    2
    3
    MariaDB [(none)]> show plugins;
    | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
    +--------------------------------+----------+--------------------+-------------------+---------+
  3. 查看下这个插件的状态,并没有启动,enabled为OFF

    1
    2
    3
    4
    5
    6
    7
    MariaDB [(none)]> show global variables like '%semi%';
    +---------------------------------+-------+
    | Variable_name | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled | OFF |
    | rpl_semi_sync_slave_trace_level | 32 |
    +---------------------------------+-------+
  4. 启用它

    1
    MariaDB [(none)]> set global rpl_semi_sync_slave_enabled=on;
  5. 看,启动了

    1
    2
    3
    4
    5
    6
    7
    MariaDB [(none)]> show global variables like '%semi%';
    +---------------------------------+-------+
    | Variable_name | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled | ON |
    | rpl_semi_sync_slave_trace_level | 32 |
    +---------------------------------+-------+
  6. 设置完还得重启线程

    1
    2
    3
    MariaDB [(none)]> stop slave; 

    MariaDB [(none)]> start slave;
主服务器:192.168.99.106
  1. 回到主服务器上看,已经有2个线程了

    1
    2
    3
    4
    5
    6
    MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';
    +--------------------------------------------+-------+
    | Variable_name | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients | 2 |
    ...
  2. 给wordpress创建帐号用

    1
    2
    MariaDB [(none)]> create database wpdb;
    MariaDB [(none)]> grant all privileges on wpdb.* to wpuser@'192.168.99.%' identified by "123";
  3. 创建帐号给powerDNS用

    1
    2
    MariaDB [(none)]> create database powerdns;
    MariaDB [(none)]> grant all privileges on powerdns.* to powerdns@'192.168.99.%' identified by "123";
  4. 创建帐号给ProxySQL监控用

    1
    MariaDB [(none)]> grant replication client on *.* to monitor@'192.168.99.%' identified by '123';
  5. 创建帐号用来ProxySQL访问的(没写错,这里真的还是4)

    1
    MySQL> grant all on *.* to sqluser@'%' identified by '123';
  6. 创建powerdns数据库中的表,参看下面

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    USE powerdns;
    CREATE TABLE domains (
    id INT AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    master VARCHAR(128) DEFAULT NULL,
    last_check INT DEFAULT NULL,
    type VARCHAR(6) NOT NULL,
    notified_serial INT DEFAULT NULL,
    account VARCHAR(40) DEFAULT NULL,
    PRIMARY KEY (id)
    ) Engine=InnoDB;

    CREATE UNIQUE INDEX name_index ON domains(name);


    CREATE TABLE records (
    id BIGINT AUTO_INCREMENT,
    domain_id INT DEFAULT NULL,
    name VARCHAR(255) DEFAULT NULL,
    type VARCHAR(10) DEFAULT NULL,
    content VARCHAR(64000) DEFAULT NULL,
    ttl INT DEFAULT NULL,
    prio INT DEFAULT NULL,
    change_date INT DEFAULT NULL,
    disabled TINYINT(1) DEFAULT 0,
    ordername VARCHAR(255) BINARY DEFAULT NULL,
    auth TINYINT(1) DEFAULT 1,
    PRIMARY KEY (id)
    ) Engine=InnoDB;

    CREATE INDEX nametype_index ON records(name,type);
    CREATE INDEX domain_id ON records(domain_id);
    CREATE INDEX recordorder ON records (domain_id, ordername);


    CREATE TABLE supermasters (
    ip VARCHAR(64) NOT NULL,
    nameserver VARCHAR(255) NOT NULL,
    account VARCHAR(40) NOT NULL,
    PRIMARY KEY (ip, nameserver)
    ) Engine=InnoDB;


    CREATE TABLE comments (
    id INT AUTO_INCREMENT,
    domain_id INT NOT NULL,
    name VARCHAR(255) NOT NULL,
    type VARCHAR(10) NOT NULL,
    modified_at INT NOT NULL,
    account VARCHAR(40) NOT NULL,
    comment VARCHAR(64000) NOT NULL,
    PRIMARY KEY (id)
    ) Engine=InnoDB;

    CREATE INDEX comments_domain_id_idx ON comments (domain_id);
    CREATE INDEX comments_name_type_idx ON comments (name, type);
    CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);


    CREATE TABLE domainmetadata (
    id INT AUTO_INCREMENT,
    domain_id INT NOT NULL,
    kind VARCHAR(32),
    content TEXT,
    PRIMARY KEY (id)
    ) Engine=InnoDB;

    CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);


    CREATE TABLE cryptokeys (
    id INT AUTO_INCREMENT,
    domain_id INT NOT NULL,
    flags INT NOT NULL,
    active BOOL,
    content TEXT,
    PRIMARY KEY(id)
    ) Engine=InnoDB;

    CREATE INDEX domainidindex ON cryptokeys(domain_id);


    CREATE TABLE tsigkeys (
    id INT AUTO_INCREMENT,
    name VARCHAR(255),
    algorithm VARCHAR(50),
    secret VARCHAR(255),
    PRIMARY KEY (id)
    ) Engine=InnoDB;

    CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

105:布署ProxySQL

proxySQL:192.168.99.105
  1. 安装前还得配置下官方的yum源
    要不就自行下载安装:https://github.com/sysown/proxysql/releases

    1
    2
    3
    4
    5
    6
    [101]$ vim /etc/yum.repos.d/proxysql.repo
    [proxysql_repo]
    name= ProxySQL YUM repository
    baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
    gpgcheck=1
    gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
  2. 安装proxySQL

    1
    2
    3
    yum clean all 

    yum install proxysql
  3. 启动proxySQL

    1
    systemctl start proxysql
  4. 端口起来了,看看

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ss -tnl
    #下面是输出
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    LISTEN 0 128 *:6032 *:*
    LISTEN 0 128 *:6033 *:*
    LISTEN 0 128 *:6033 *:*
    LISTEN 0 128 *:6033 *:*
    LISTEN 0 128 *:6033 *:*
    ......
  5. 登录前你还需要

    1
    yum -y install mariadb
  6. 登录到proxysql试试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    mysql -uadmin -padmin -P6032 -h127.0.0.1
    #下面是输出
    Welcome to the MariaDB monitor. Commands end with ; or \g.
    Your MySQL connection id is 1
    Server version: 5.5.30 (ProxySQL Admin Module)

    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    MySQL [(none)]>

连接成功,简单看看

1
2
3
4
5
6
7
8
9
10
MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name | file |
+-----+---------------+-------------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
| 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
  1. 大致来了解下

    1
    2
    3
    4
    5
    #查看表结构
    MySQL > select * from sqlite_master where name='mysql_servers'\G

    #查看你的SQL服务器有哪些,当然什么都没有,还没有添加
    MySQL > select * from mysql_servers;
  2. 添加你的3台MySQL主机

    1
    2
    3
    4
    5
    MySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.99.106',3306);

    MySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.99.107',3306);

    MySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.99.108',3306);
  3. 添加上了,可以看看

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MySQL > select * from mysql_servers;
    +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
    | hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
    +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
    | 10 | 192.168.99.106 | 3306 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
    | 20 | 192.168.99.108 | 3306 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
    | 20 | 192.168.99.107 | 3306 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
    +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+


  4. 当然,这2步少不了。加载并保存到磁盘

    1
    2
    3
    MySQL > load mysql servers to runtime;

    MySQL > save mysql servers to disk;

    添加监控后端节点的用户。ProxySQL通过每个节点的read_only值来自动调整它们是属于读组还是写组

  5. 添加监控后端节点的用户。后面ProxySQL通过每个节点的read_only值来自动调整它们是属于读组还是写组

    1
    2
    MySQL [(none)]> set mysql-monitor_username='monitor';
    MySQL [(none)]> set mysql-monitor_password='123';
  6. 加载到RUNTIME,并保存到disk

    1
    2
    MySQL [(none)]> load mysql variables to runtime;
    MySQL [(none)]> save mysql variables to disk;
  7. 查看监控连接是否正常的 (对connect指标的监控):(如果connect_error的结果为NULL则表示正常,看最后2条)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    MySQL [(none)]> select * from mysql_server_connect_log;
    +----------------+------+------------------+-------------------------+-------------------------------------------------------------------------+
    | hostname | port | time_start_us | connect_success_time_us | connect_error |
    +----------------+------+------------------+-------------------------+-------------------------------------------------------------------------+
    ...
    | 192.168.99.108 | 3306 | 1564319563111306 | 2242 | NULL |
    | 192.168.99.107 | 3306 | 1564319563558118 | 2541 | NULL |
    | 192.168.99.106 | 3306 | 1564319564004888 | 2178 | NULL |
    | 192.168.99.108 | 3306 | 1564319623112139 | 3408 | NULL |
    | 192.168.99.106 | 3306 | 1564319623596123 | 3384 | NULL |
    | 192.168.99.107 | 3306 | 1564319624080684 | 2681 | NULL |
    | 192.168.99.106 | 3306 | 1564319683112439 | 3277 | NULL |
    | 192.168.99.108 | 3306 | 1564319683641071 | 3359 | NULL |
    | 192.168.99.107 | 3306 | 1564319684169766 | 1197 | NULL |
    +----------------+------+------------------+-------------------------+-------------------------------------------------------------------------+


  8. 也可以查看监控心跳信息 (对ping指标的监控)(如果ping_error的结果为NULL则表示正常)

    1
    MySQL> select * from mysql_server_ping_log;
  9. 还有其它的,查看read_only和replication_lag的监控日志

    1
    2
    MySQL> select * from mysql_server_read_only_log;
    MySQL> select * from mysql_server_replication_lag_log;

设置分组信息

  1. 需要修改的是main库中的mysql_replication_hostgroups表,该表有3个字段:writer_hostgroup写组,reader_hostgroup读组,comment备注, 指定写组的id为10,读组的id为20

    1
    MySQL> insert into mysql_replication_hostgroups values(10,20,"test");
  2. 加载到RUNTIME生效并保存

    1
    2
    MySQL> load mysql servers to runtime;
    MySQL> save mysql servers to disk;
  3. Monitor模块监控后端的read_only值,按照read_only的值将节点自动移动到读/写组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    MySQL> select hostgroup_id,hostname,port,status,weight from mysql_servers;
    +--------------+----------------+------+--------+--------+
    | hostgroup_id | hostname | port | status | weight |
    +--------------+----------------+------+--------+--------+
    | 10 | 192.168.99.106 | 3306 | ONLINE | 1 |
    | 20 | 192.168.99.108 | 3306 | ONLINE | 1 |
    | 20 | 192.168.99.107 | 3306 | ONLINE | 1 |
    +--------------+----------------+------+--------+--------+

  4. 在ProxySQL配置,将用户sqluser添加到mysql_users表中, default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库

    1
    2
    3
    4
    5
    MySQL> insert into mysql_users(username,password,default_hostgroup) values('sqluser','123',10);

    MySQL> insert into mysql_users(username,password,default_hostgroup) values('wpuser','123',10);

    MySQL> insert into mysql_users(username,password,default_hostgroup) values('powerdns','123',10);
  5. 保存生效

    1
    2
    MySQL> load mysql users to runtime;
    MySQL> save mysql users to disk;
  6. 使用sqluser用户测试是否能路由到默认的10写组实现读、写数据。是的,我的写组就是主服务器,也就是server_id=2的主机。

    1
    2
    3
    4
    5
    6
    [105]$ mysql -usqluser -p123 -P6033 -h127.0.0.1 -e 'select @@server_id'
    +-------------+
    | @@server_id |
    +-------------+
    | 106 |
    +-------------+
  7. 创建个数据库,看看能不能行

    1
    2
    3
    4
    [101]$ mysql -usqluser -p123 -P6033 -h127.0.0.1 -e 'create database testdb'
    #然后去主从服务器上看看,有没有这个数据库
    #这里还创建了个表,也去看看有没有
    [101]$ mysql -usqluser -p123 testdb -P6033 -h127.0.0.1 -e 'create table t(id int)'

在proxysql上配置路由规则,实现读写分离

与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing,后者是前者的扩展表,1.4.7之后支持
插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句SELECT…FOR UPDATE它会申请写锁,应路由到10的写组

  1. 具体可以这样写

    1
    2
    3
    4
    5
    6
    #先进入
    [105]$ mysql -uadmin -padmin -P6032 -h127.0.0.1

    MySQL> insert into mysql_query_rules
    (rule_id,active,match_digest,destination_hostgroup,apply)VALUES
    (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
  2. 保存生效

    1
    2
    MySQL> load mysql query rules to runtime;
    MySQL> save mysql query rules to disk;

    注意:因ProxySQL根据rule_id顺序进行规则匹配,select … for update规则的rule_id必须要小于普通的select规则的rule_id

  3. 看下生效了没,已经有了2条记录了

    1
    2
    3
    4
    5
    6
    7
    MySQL [(none)]> select rule_id,active,match_digest,destination_hostgroup,apply from mysql_query_rules;
    +---------+--------+----------------------+-----------------------+-------+
    | rule_id | active | match_digest | destination_hostgroup | apply |
    +---------+--------+----------------------+-----------------------+-------+
    | 1 | 1 | ^SELECT.*FOR UPDATE$ | 10 | 1 |
    | 2 | 1 | ^SELECT | 20 | 1 |
    +---------+--------+----------------------+-----------------------+-------+

到这里就可以实现读写分离了

  1. 那就来测试下吧,以事务和非事务的方式进行测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [105]$ mysql -usqluser -p123 -P6033 -h127.0.0.1 -e 'start transaction;select @@server_id;commit;select @@server_id'
    +-------------+
    | @@server_id |
    +-------------+
    | 106 |
    +-------------+
    +-------------+
    | @@server_id |
    +-------------+
    | 107 |
    +-------------+

    #那为什么会一个是106,一个是107呢。
    #这是因为我们配置的时候,只有SELECT开头的才到从服务器访问,
    #事务是以BEGIN或者START TRANSACTION开头的,所以会支访问主服务器。
  2. 再执行一次

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [105]$ mysql -usqluser -p123 -P6033 -h127.0.0.1 -e 'start transaction;select @@server_id;commit;select @@server_id'
    +-------------+
    | @@server_id |
    +-------------+
    | 106 |
    +-------------+
    +-------------+
    | @@server_id |
    +-------------+
    | 108 |
    +-------------+
    #看到没,108了
  3. 创建个表,插入的内容来查查看看吧。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #前面已经把testdb这个数据库创建了
    [101]$ mysql -usqluser -p123 -P6033 -h127.0.0.1 -e 'use testdb;create table t(id int);'
    [101]$ mysql -usqluser -p123 -P6033 -h127.0.0.1 -e 'insert testdb.t values (1)'
    [101]$ mysql -usqluser -p123 -P6033 -h127.0.0.1 -e 'select id from testdb.t'
    +------+
    | id |
    +------+
    | 1 |
    +------+

    在这里强调下:
    (1)进入proxySQL管理界面是:mysql -uadmin -padmin -P6032 -h127.0.0.1,端口号是:6032,默认的帐号密码是admin和admin。
    (2)如果使用mysql -usqluser -p123 -P6033 -h127.0.0.1则访问的是主服务器上的数据库了。

搞定了,接着看


101:布署powerDNS

主机:192.168.99.101
  1. 这是在主机101上
    安装包:基于EPEL源

    1
    yum install -y pdns pdns-backend-mysql
  2. 安装http + php

    1
    yum -y install httpd  php php-mysql php-mbstring
  3. 启动服务

    1
    systemctl start httpd
  4. 没有4

  5. 配置PowerDNS使用mariadb作为后台数据存储

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #查找到包含launch= 的行,修改并添加下面的内容
    [102]$ vim /etc/pdns/pdns.conf
    #大概在250行
    launch=gmysql
    gmysql-host=192.168.99.105 #ProxySQL的ip
    gmysql-port=6033 #端口
    gmysql-dbname=powerdns #数据库名
    gmysql-user=powerdns #用户
    gmysql-password=123 #密码
  6. 启动服务

    1
    2
    systemctl start pdns
    systemctl enable pdns
  7. 安装httpd和php相关包

    1
    yum -y install  php-devel php-gd php-mcrypt php-imap php-ldap  php-odbc php-pear php-xml php-xmlrpc php-mcrypt php-mhash gettext
  8. 启动服务

    1
    systemctl restart httpd
  9. 下载poweradmin程序,

    1
    2
    cd /var/www/html
    wget http://downloads.sourceforge.net/project/poweradmin/poweradmin-2.1.7.tgz
  10. 解压缩到相应目录

    1
    2
    tar xvf poweradmin-2.1.7.tgz
    mv poweradmin-2.1.7 poweradmin

    设置下权限

    1
    setfacl -Rm u:apache:rwx poweradmin
  11. 访问下面地址,启动PowerAdmin的网页安装向导:
    http://192.168.99.101/poweradmin/install/
    选英语,下一步。下一步


提供先前配置的数据库详情,同时为Poweradmin设置管理员密码

在这里插入图片描述


  1. 为Poweradmin创建一个受限用户
标题 说明
Username PowerAdmin用户名
Password 上述用户的密码
Hostmaster 创建SOA记录指定默认主机管理员
Primary nameserver 主域名服务器
Secondary namesever 辅域名服务器

在这里插入图片描述


  1. 按照下面页面说明,在数据库中创建用户并授权,然后再下一步
    注意啊,这里是 ==106主机==, 是数据库的主服务器。
    1
    2
    3
    [106]$ mysql

    MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE ON powerdns.* TO 'poweradmin'@'localhost' IDENTIFIED BY '123';

  1. 按下面页面说明,修改config.in.php文件内容,注意==不要复制我的,不要复制我的,看你自己的==
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    [101]$ mv poweradmin/inc/config-me.inc.php poweradmin/inc/config.inc.php

    [101]$ vim /var/www/html/poweradmin/inc/config.inc.php
    18 $db_host = '192.168.99.105';
    19 $db_port = '6033';
    20 $db_user = 'powerdns';
    21 $db_pass = '123';
    22 $db_name = 'powerdns';
    23 $db_type = 'mysql';
    ...
    26 $db_layer = 'PDO'; # or MDB2
    ...
    30 $session_key = 'gKB$t5Qx%l!%$d+M~T$Hv+lABp$nNKKRe{7v}W3SMO0=kN';
    ...
    34 $iface_lang = 'en_EN';
    ...
    43 $dns_hostmaster = 'powerserver';
    44 $dns_ns1 = '192.168.99.101';
    45 $dns_ns2 = '192.168.99.101';

在这里插入图片描述

  1. 安装完毕后,删除install目录
    1
    [101]$ rm -rf /var/www/html/poweradmin/install/

  1. 登录http://powerdns服务器IP/poweradmin/
    1
    2
    username:admin
    password:123
    这里登录不了提示:Error: You have to install PHP mcrypt extension
    解决:
    1
    2
    3
    4
    5
    6
    7
    vim /etc/httpd/conf.modules.d/10-php.conf
    ...
    5 <IfModule prefork.c>
    6 LoadModule php5_module modules/libphp5.so
    7 LoadModule php5_module modules/mcrypt.so
    8 </IfModule>


  1. 来添加个zone

  1. list zone,准备给这个zone添加记录

  1. 添加A记录,指向192.168.99.102

  1. 再添加一条,指向192.168.99.103

  1. 查看,直接search就可以

在这里插入图片描述


  1. 看,这就有2条记录了。
    在这里插入图片描述

104:NFS配置

主机:192.168.99.104
  1. 安装

    1
    [104]$ yum install -y nfs-utils
  2. 配置

    1
    2
    3
    4
    5
    [104]$ vim /etc/exports
    /data/wordpress 192.168.99.0/24(rw,all_squash,anonuid=997,anongid=995)

    #加载
    [104]$ exportfs -r
  3. 启动服务

    1
    [104]$ systemctl restart nfs-server
  4. 创建用户

    1
    2
    [104]$ groupadd -g 995 apache
    [104]$ useradd -r -u 997 -g 995 -s /sbin/nologin apache

104:布署wordpress

192.168.99.104
这是在104,NFS服务器 1. 下载
1
2
[104]$ cd
[104]$ wget ftp://192.168.99.1/Magedu37/files/lamp/wordpress-5.0.3-zh_CN.tar.gz
2. 解压
1
[104]$ tar xf wordpress-5.0.3-zh_CN.tar.gz -C /data/
  1. 删除包
    1
    2
    [104]$ rm -f wordpress-5.0.3-zh_CN.tar.gz
    [104]$ chown -R apache.apache /data/wordpress/

102:安装apache+php

主机:192.168.99.102
  1. 在主机102上安装php和httpd

    1
    [102]$ yum -y install php httpd php-mysql php-mbstring
  2. 修改配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [102]$ vim /etc/httpd/conf.d/test.conf

    <virtualhost *:80>
    documentroot /data/wordpress
    servername blog.jibill.com
    <directory /data/wordpress>
    require all granted
    </directory>
    </virtualhost>
  3. 重启服务

    1
    [102]$ systemctl restart httpd24
  4. 安装nfs-utils准备挂载nfs

    1
    2
    3
    [102]$ yum -y install nfs-utils
    [102]$ mkdir /data/wordpress
    [102]$ mount 192.168.99.104:/data/wordpress /data/wordpress
  5. 来测试下。注意下方多图预警
    因为还没配主机103,所以先用192.168.99.102测试,
    可以修改hosts文件

    1
    2
    vim hosts
    192.168.99.102 blog.jibill.com

    在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

下面配置103,实现web服务器的负载均衡


103:安装apache+php

主机:192.168.99.103
  1. 在主机103上安装php和httpd

    1
    [102]$ yum -y install php httpd php-mysql php-mbstring
  2. 修改配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [102]$ vim /etc/httpd/conf.d/test.conf

    <virtualhost *:80>
    documentroot /data/wordpress
    servername blog.jibill.com
    <directory /data/wordpress>
    require all granted
    </directory>
    </virtualhost>
  3. 重启服务

    1
    [102]$ systemctl restart httpd24
  4. 安装nfs-utils准备挂载nfs

    1
    2
    3
    [102]$ yum -y install nfs-utils
    [102]$ mkdir /data/wordpress
    [102]$ mount 192.168.99.104:/data/wordpress /data/wordpress

192.168.99.108
  1. 测试下,先修改DNS,然后重启网卡,==记得把你的hosts文件清空,别忘了刚才添加的那条==

在这里插入图片描述

1
[108]$ systemctl restart network
  1. 访问blog.jibill.com/成功

在这里插入图片描述

这样还能实现web服务器的负载均衡

在这里插入图片描述

在这里插入图片描述

利用NFS服务实现用户家目录漫游

  1. 实验环境:
    NFS服务器:192.168.99.103
    客户端A:192.168.99.101
    客户端B:192.168.99.102
NFS服务器:192.168.99.103
  1. 创建用户wang

    1
    [103]$ useradd wang
  2. 安装nfs工具

    1
    [103]$ yum -y install nfs-utils
  3. 修改配置

    1
    2
    [103]$ vim /etc/exports.d/test.exports
    /home/wang *(rw,anonuid=1000,anongid=1000,all_squash)
  4. 启动服务

    1
    [103]$ systemctl restart nfs-server
  5. 每次修改完后,只需要加载配置文件就可以了,用这条命令

    1
    [103]$ exportfs -r
客户端A:192.168.99.101
  1. 这边也要创建用户
    1
    [101]$ useradd wang
  2. 安装NFS工具
    1
    [101]$ yum -y install nfs-utils
  3. 查看NFS服务器共享的目录
    1
    2
    3
    [101]$ showmount -e 192.168.99.103
    Export list for 192.168.99.103:
    /home/wang *(rw,anonuid=1000,anongid=1000,all_squash)
  4. 挂载
    1
    [101]$ mount 192.168.99.103:/home/wang /home/wang
  5. 切换用户
    1
    [101]$ su - wang
  6. 在wang家目录上创建个文件,可以写,
    1
    2
    3
    [wang@localhost ~]$ touch 101
    [wang@localhost ~]$ ls
    101
客户端B:192.168.99.102

1,2,3,4和客户端A一模一样

  1. 切换用户
    1
    [102]$ su - wang
  2. 创建个文件,并看看有没有客户端101上创建的文件
    1
    2
    3
    [wang@localhost ~]$ touch 102
    [wang@localhost ~]$ ls
    101 102
客户端A:192.168.99.101

下面实现autofs自动挂载

  1. 要先安装autofs

    1
    [101]$ yum -y install autofs
  2. 在主配置文件添加这条

    1
    2
    3
    4
    [101]$ cat /etc/auto.master
    ...
    8 /- /etc/auto.master.d/auto.home.wang
    ...
  3. 在子配置文件/etc/auto.master.d/auto.home.wang

    1
    2
    [101]$ cat /etc/auto.master.d/auto.home.wang
    /home/wang -fstype=nfs,rw 192.168.99.103:/home/wang

文件传输协议FTP

DAS、SAN 、NAS
在这里插入图片描述
#存储基础知识—存储网络

  1. 直接存储(Direct Attached Storage)。存储设备与主机的紧密相连
    •管理成本较低,实施简单
    •储时直接依附在服务器上,因此存储共享受到限制
    •CPU必须同时完成磁盘存取和应用运行的双重任务,所以不利于CPU的指令周期的优化,增加系统负担

  2. 网络连接存储(Network Attached Storage): 通过局域网在多个文件服务器之间实现了互联,基于文件的协议( FTP、NFS、SMB/CIFS等 ),实现文件共享
    •集中管理数据,从而释放带宽、提高性能
    •可提供跨平台文件共享功能
    •可靠性较差,适用于局域网或较小的网络

  3. 存储区域网络(Storage Area Networks,SAN) 利用高速的光纤网络链接服务器与存储设备,基于SCSI,IP,ATM等多种高级协议,实现存储共享
    •服务器跟储存装置两者各司其职
    •利用光纤信道来传输数据﹐以达到一个服务器与储存装置之间多对多的高效能、高稳定度的存储环境
    •实施复杂,管理成本高

  4. 比较

DAS NAS SAN
传输类型 SCSI/FC IP IP/FC/SAS
数据类型 数据块 文件 数据块
典型应用 任何 文件服务器 数据库应用
优点 磁盘与服务器分离
便于统一管理
不占用应用服务器资源
广泛支持操作系统
扩展较容易
即插即用,安装简单
高扩展性,高可用性,数据集中,易管理
缺点 连接距离短
数据分散,共享困难
存储空间利用率不高
扩展性有限
不适合存储量大的块级应用
数据备份及恢复占用网络带宽
相比NAS成本较高
安装和升级比NAS复杂

File Transfer Protocol 早期的三个应用级协议之一
基于C/S结构
双通道协议:数据和命令连接
数据传输格式:二进制(默认)和文本

两种模式:

  1. 主动(PORT style):服务器主动连接
    命令(控制):客户端:随机port <= => 服务器:tcp21
    数据:客户端:随机port <= => 服务器:tcp20
  2. 被动(PASV style):客户端主动连接
    命令(控制):客户端:随机port <= => 服务器:tcp21
    数据:客户端:随机port <= => 服务器:随机port
  • 服务器被动模式数据端口示例:
    227 Entering Passive Mode (172,16,0,1,224,59)
    服务器数据端口为:224*256+59=57403

FTP软件介绍

  • FTP服务器:
  1. Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
  2. vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器
    高速,稳定,下载速度是WU-FTP的两倍
    ftp.redhat.com数据:单机最多可支持15000个并发
  • 客户端软件:
  1. ftp,lftp,lftpget,wget,curl
  2. ftp -A ftpserver port (-A主动模式 –p 被动模式)
  3. lftp –u username ftpserver
  4. lftpget ftp://ftpserver/pub/file
  5. gftp:GUI centos5 最新版2.0.19 (11/30/2008)
  6. filezilla,CuteFtp,FlashFXP,LeapFtp
  7. 浏览器:ftp://username:password@ftpserver

FTP服务

  • 状态码:
    1XX:信息 125:数据连接打开
    2XX:成功类状态 200:命令OK 230:登录成功
    3XX:补充类 331:用户名OK
    4XX:客户端错误 425:不能打开数据连接
    5XX:服务器错误 530:不能登录

  • 用户认证:

    1. 匿名用户:ftp,anonymous
    2. 系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
    3. 虚拟用户:特定服务的专用用户,独立的用户/密码文件
    4. nsswitch:network service switch名称解析框架
    5. pam:pluggable authentication module 用户认证
      /lib64/security /etc/pam.d/ /etc/pam.conf

vsftpd服务

由vsftpd包提供

  1. 用户认证配置文件:/etc/pam.d/vsftpd
  2. 服务脚本: /usr/lib/systemd/system/vsftpd.service
    /etc/rc.d/init.d/vsftpd
  3. 配置文件:/etc/vsftpd/vsftpd.conf
  4. 帮助:man 5 vsftpd.conf
  5. 用户:
    匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
    系统用户共享文件位置:用户家目录
    虚拟用户共享文件位置:为其映射的系统用户的家目录

vsftpd服务配置

1. 端口

  1. 命令端口
    1
    listen_port=21
  2. 主动模式端口
    1
    2
    connect_from_port_20=YES  #主动模式端口为20
    ftp_data_port=20 #(默认) 指定主动模式的端口
  3. 被动模式端口范围
    1
    2
    3
    4
    linux #客户端默认使用被动模式
    windows #客户端默认使用主动模式
    pasv_min_port=6000 #0为随机分配
    pasv_max_port=6010
  4. 使用当地时间
    1
    use_localtime=YES  #使用当地时间(默认为NO,使用GMT)

2. 用户

  1. 匿名用户

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    anonymous_enable=YES #支持匿名用户
    no_anon_password=YES #(默认NO) 匿名用户略过口令检查
    anon_upload_enable=YES #匿名上传,注意:文件系统权限
    anon_mkdir_write_enable=YES #匿名建目录
    anon_world_readable_only #(默认YES)只能下载全部读的文件
    anon_umask=0333 #指定匿名上传文件的umask,默认077
    anon_other_write_enable=YES #可删除和修改上传的文件
    #指定上传文件的默认的所有者和权限
    chown_uploads=YES(默认NO)
    chown_username=wang
    chown_upload_mode=0644
  2. Linux系统用户

    1
    2
    3
    4
    5
    6
    local_enable=YES  #是否允许linux用户登录
    write_enable=YES #允许linux用户上传文件
    local_umask=022 #指定系统用户上传文件的默认权限
    guest_enable=YES # 所有系统用户都映射成guest用户
    guest_username=ftp #配合上面选项才生效,指定guest用户
    local_root=/ftproot guest #用户登录所在目录
  3. 禁锢所有系统用户在家目录中

    1
    chroot_local_user=YES(默认NO,不禁锢)禁锢系统用户
  4. 禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反

    1
    2
    3
    4
    5
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list

    chroot_local_user=YES #则chroot_list中用户不禁锢
    #chroot_local_user=NO时,则chroot_list中用户禁锢

3. 日志

  1. wu-ftp日志:默认启用

    1
    2
    3
    xferlog_enable=YES    #(默认) 启用记录上传下载日志
    xferlog_std_format=YES #(默认) 使用wu-ftp日志格式
    xferlog_file=/var/log/xferlog #(默认)可自动生成
  2. vsftpd日志:默认不启用

    1
    2
    dual_log_enable=YES    #使用vsftpd日志格式,默认不启用
    vsftpd_log_file=/var/log/vsftpd.log #(默认)可自动生成

4. 提示信息

  1. 登录提示信息
    1
    2
    ftpd_banner="welcome to mage ftp server"
    banner_file=/etc/vsftpd/ftpbanner.txt
  2. 目录访问提示信息
    1
    2
    dirmessage_enable=YES   #(默认)
    message_file=.message #(默认) 信息存放在指定目录下.message

5. 使用pam完成用户认证

1.

1
pam_service_name=vsftpd
  1. pam配置文件:/etc/pam.d/vsftpd

    1
    /etc/vsftpd/ftpusers #默认文件中用户拒绝登录
  2. 是否启用控制用户登录的列表文件

    1
    2
    3
    userlist_enable=YES   #默认有此设置
    userlist_deny=YES #默认值 黑名单,不提示口令,NO为白名单
    userlist_file=/etc/vsftpd/users_list #此为默认值
  3. vsftpd服务指定用户身份运行

    1
    nopriv_user=nobody   #(默认值)

6. 传输

  1. 连接数限制

    1
    2
    max_clients=0   #最大并发连接数
    max_per_ip=0 #每个IP同时发起的最大连接数
  2. 传输速率:字节/秒

    1
    2
    anon_max_rate=0   #匿名用户的最大传输速率
    local_max_rate=0 #本地用户的最大传输速率
  3. 连接时间:秒为单位

    1
    2
    3
    4
    connect_timeout=60   #主动模式数据连接超时时长
    accept_timeout=60 #被动模式数据连接超时时长
    data_connection_timeout=300 #数据连接无数据输超时时长
    idle_session_timeout=60 #无命令操作超时时长
  4. 优先以文本方式传输

    1
    2
    ascii_upload_enable=YES
    ascii_download_enable=YES

实现基于SSL的FTPS

  1. 查看是否支持SSL

    1
    ldd `which vsftpd` #查看到libssl.so
  2. 创建自签名证书

    1
    2
    3
    4
    5
    cd /etc/pki/tls/certs/
    make vsftpd.pem

    #查看证书
    openssl x509 -in vsftpd.pem -noout –text
  3. 配置vsftpd服务支持SSL:/etc/vsftpd/vsftpd.conf

    1
    2
    3
    4
    5
    6
    [101]$ vim /etc/vsftpd/vsftpd.conf
    ssl_enable=YES #启用SSL
    allow_anon_ssl=NO #匿名不支持SSL
    force_local_logins_ssl=YES #本地用户登录加密
    force_local_data_ssl=YES #本地用户数据传输加密
    rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
  4. 用filezilla等工具测试

vsftpd虚拟用户

  1. 虚拟用户:
    所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
    各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
  2. 虚拟用户帐号的存储方式:
    (1)文件:编辑文本文件,此文件需要被编码为hash格式
    奇数行为用户名,偶数行为密码
    db_load -T -t hash -f vusers.txt vusers.db

(2)关系型数据库中的表中:
实时查询数据库完成用户认证
(3)mysql库:pam要依赖于pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README

数据的实时同步

  1. 实现实时同步
    要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
    发现目录中数据产生变化,就利用rsync服务推送到备份服务器上

  2. inotify+rsync 方式实现数据同步
    sersync :金山公司周洋在 inotify 软件基础上进行开发的,功能更加强大
    inotify

    异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件

  3. 实现inotify软件:
    inotify-tools,sersync,lrsyncd

inotify和rsync

inotify: 对同步数据目录信息的监控
rsync: 完成对数据的同步

  • 查看服务器内核是否支持inotify
    Linux下支持inotify的内核最小为2.6.13

    1
    2
    3
    4
    5
    ll /proc/sys/fs/inotify 
    #列出下面的文件,说明服务器内核支持inotify
    -rw-r--r-- 1 root root 0 Dec 7 10:10 max_queued_events
    -rw-r--r-- 1 root root 0 Dec 7 10:10 max_user_instances
    -rw-r--r-- 1 root root 0 Dec 6 05:54 max_user_watches
  • inotify内核参数
    参数说明:参看man 7 inotify

    1
    2
    3
    max_queued_events:inotify  # 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384
    max_user_watches #可以监视的文件数量(单进程),默认值:8192
    max_user_instances #每个用户创建inotify实例最大值,默认值:128
  • 安装:基于epel源

    1
    yum install inotify-tools
  • inotify-tools包主要文件:

    • inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,常用于实时同步的目录监控
    • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

inotify和rsync实现实时同步

inotifywait命令常见

选项 说明
-m, –monitor 始终保持事件监听
-d, –daemon 以守护进程方式执行,和-m相似,配合-o使用
-r, –recursive 递归监控目录数据信息变化
-q, –quiet 输出少量事件信息
–exclude 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
–excludei 和exclude相似,不区分大小写
-o, –outfile 打印事件到文件中,相当于标准正确输出
-s, –syslogOutput 发送错误到syslog相当于标准错误输出
–timefmt 指定时间输出格式
–format 指定的输出格式;即实际监控输出内容
-e 指定监听指定的事件,如果省略,表示所有事件都进行监听

--timefmt <fmt>时间格式

格式 说明
%Y 年份信息,包含世纪信息
%y 年份信息,不包括世纪信息
%m 显示月份,范围 01-12
%d 每月的第几天,范围是 01-31
%H 小时信息,使用 24小时制,范围 00-23
%M 分钟,范围 00-59

示例:

1
--timefmt "%Y-%m-%d %H:%M"

--format <fmt> 格式定义

格式 说明
%T 输出时间格式中定义的时间格式信息,通过 –timefmt option 语法格式指定时间信息
%w 事件出现时,监控文件或目录的名称信息
%f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
%e 显示发生的事件信息,不同的事件默认用逗号分隔
%Xe 显示发生的事件信息,不同的事件指定用X进行分隔

示例:

1
2
--format "%T %w%f event: %;e"
--format '%T %w %f'

-e选项指定的事件类型

类型 说明
create 文件或目录创建
delete 文件或目录被删除
modify 文件或目录内容被写入
attrib 文件或目录属性改变
close_write 文件或目录关闭,在写入模式打开之后关闭的
close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
close 文件或目录关闭,不管读或是写模式
open 文件或目录被打开
moved_to 文件或目录被移动到监控的目录中
moved_from 文件或目录从监控的目录中被移动
move 文件或目录不管移动到或是移出监控目录都触发事件
access 文件或目录内容被读取
delete_self 文件或目录被删除,目录本身被删除
unmount 取消挂载

示例:

1
-e create,delete,moved_to,close_write, attrib

示例:

监控一次性事件

1
inotifywait /data

持续监控

1
inotifywait -mrq /data

持续后台监控,并记录日志

1
inotifywait -o /root/inotify.log -drq /data --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event: %e"

持续后台监控特定事件

1
inotifywait -mrq /data --timefmt “%F %H:%M” --format “%T %w%f event: %;e” -e create,delete,moved_to,close_write,attrib

配置 rsync 服务器端的配置文件

  1. 先安装:yum install rsync

  2. 改配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    [101]$ vi /etc/rsyncd.conf

    uid = root
    gid = root
    use chroot = no
    max connections = 0
    ignore errors
    exclude = lost+found/
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock
    reverse lookup = no
    hosts allow = 192.168.8.0/24
    [backup]
    path = /backup/
    comment = backup
    read only = no
    auth users = rsyncuser
    secrets file = /etc/rsync.pass
  3. 服务器端生成验证文件

    1
    2
    echo "rsyncuser:123" > /etc/rsync.pass
    chmod 600 /etc/rsync.pass
  4. 服务器端准备目录

    1
    mkdir /backup
  5. 服务器端启动rsync服务

    1
    2
    rsync --daemon   #可加入/etc/rc.d/rc.local实现开机启动
    systemctl start rsyncd

客户端配置

  1. 密码文件

    1
    2
    echo "123" > /etc/rsync.pass
    chmod 600 /etc/rsync.pass
  2. 客户端测试同步数据

    1
    2
    3
    4
    yum -y install rsync inotify-tools
    rsync -avz --password-file=/etc/rsync.pass /data/ rsyncuser@192.168.99.101::

    rsync -avz /data/ansible/ansible-roles rsyncuser@159.138.228.76:/data/ansible
  3. 客户端创建inotify_rsync.sh脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    SRC-roles='/data/ansible/ansible-roles'
    SRC-down12='/data/ansible/ansible_down_1.2'
    SRC-down14='/data/ansible/ansible_down_1.4'
    DEST='rsyncuser@159.138.228.76:/data/ansible'

    inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC-roles} |while read DATE TIME DIR FILE;do
    FILEPATH=${DIR}${FILE}
    rsync -az --delete ${SRC-roles} $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
    done

HTTP proxy

apt -y install tinyproxy

/etc/tinyproxy/tinyproxy.conf

1
2
3
4
5
6
7
8
9
10
# 允许代理的目标端口
ConnectPort 6443

# 代理的端口
Port 18888

# 允许源
Allow 0.0.0.0/0


apt install

apt update
apt install nfs-common nfs-kernel-server
echo ‘/data/nfs-data *(rw,sync,no_root_squash,no_subtree_check)’ >> /etc/exports
exportfs -a
systemctl restart nfs-kernel-server

test
showmount -e 10.10.2.228

sftp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
groupadd sftp
useradd -g sftp -s /sbin/nologin -M nfs-sftpuser
passwd nfs-sftpuser

cd /data/nfs-data
mkdir aig-plugin aog-plugin
chown -R nfs-sftpuser:sftp aig-plugin aog-plugin

vim /etc/ssh/sshd_config
Subsystem sftp internal-sftp
Match User nfs-sftpuser # 这行用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割 匹配用户的话用 Match User sftpuser
ChrootDirectory /data/nfs-data # 用chroot将用户的根目录指定到/data/sftp/%u,%u代表用户名,这样用户就只能在/data/sftp/%u下活动
ForceCommand internal-sftp # 指定sftp命令
AllowTcpForwarding no # 以下这两行,限制该用户使用端口转发
X11Forwarding no

systemctl restart sshd.service

test
sftp nfs-sftpuser@10.10.2.228

pv/pvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ip=10.10.8.100
pvc_namespace=ev000026scbbssu01-01
name=for-han

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-$name
spec:
capacity:
storage: 40Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/nfs-data/aig-plugin/scb_poc
server: $ip
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-$name
namespace: $pvc_namespace
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 40Gi
volumeName: pv-nfs-$name
EOF

Usage example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
name: nfs-client-pod
spec:
containers:
- name: app-container
image: your-container-image
volumeMounts:
- name: nfs-storage #与下面相同即可
mountPath: "/mnt/nfs" #挂载到容器内的路径
volumes:
- name: nfs-storage #定义volume名字
persistentVolumeClaim:
claimName: nfs-pvc #要改这个

apt install

apt update
apt install nfs-common nfs-kernel-server
echo ‘/data/nfs-data *(rw,sync,no_root_squash,no_subtree_check)’ >> /etc/exports
exportfs -a
systemctl restart nfs-kernel-server

test
showmount -e 10.10.2.228

pv/pvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ip=10.10.8.100
pvc_namespace=ev000027psbfsu01
name=jinrong-3

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-$name
spec:
capacity:
storage: 40Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/nfs-data/aig-plugin/scb_poc
server: $ip
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-$name
namespace: $pvc_namespace
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 40Gi
volumeName: pv-nfs-$name
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
piVersion: v1
kind: Pod
metadata:
name: nfs-client-pod
spec:
containers:
- name: app-container
image: your-container-image
volumeMounts:
- name: nfs-storage #与下面相同即可
mountPath: "/data/apigw/plugins" #挂载到容器内的路径
volumes:
- name: nfs-storage #定义volume名字
persistentVolumeClaim:
claimName: pvc-nfs-jinrong-3 #固定不变

dpkg

dpkg -i nfs*deb
mkdir -p /data/nfs-share
echo ‘/data/nfs-share *(rw,sync,no_root_squash,no_subtree_check)’ >> /etc/exports
exportfs -a
systemctl restart nfs-kernel-server

mount -t nfs 10.10.0.144:/data/nfs-share /mnt

dpkg -i nfs*deb
mkdir -p /data/nfs-share
echo ‘/data/apps/ansible/ansible_down/muimage *(rw,sync,no_root_squash,no_subtree_check)’ >> /etc/exports
echo ‘/data/apps/ansible/v0.4/ansible/ansible_down/muimage *(rw,sync,no_root_squash,no_subtree_check)’ >> /etc/exports
exportfs -a
systemctl restart nfs-kernel-server

mount -t nfs 10.10.0.144:/data/nfs-share /mnt

scp 直接
real 2m8.298s
user 0m27.090s
sys 0m18.991s

MU deploy in kubernetes.

1. create vm (5 min)

2. make lvm on deployment vm (0.5 min)

3. get mu package 7.4G (20 min)~(1 min)

wget http://10.0.0.12:8888/ansible-v0.4.1122.tgz

4. unarchive mu package (3 min)

cd /data/apps ; tar xf ansible-v0.4.1122.tgz

5. run install (7.5 min)

cd /data/apps/ansible/mu-ansible

time ./install.sh -m 10.10.0.181,10.10.0.156,10.10.0.113 -n 10.10.0.70,10.10.0.59,10.10.0.41 -c 10.0.0.12

6. login mu web and create tenant

7. and create workspace, env, az, Region.

8. insert data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- get env id
select id from `specmgmt`.Environment;
-- get az id
select id from `specmgmt`.AvailableZone;

-- apt
INSERT INTO `specmgmt`.`APT` (`id`,`create_time`, `creator_id`, `update_time`, `updator_id`, `Scope_ID`, `IP`, `Port`)
VALUES (1,now(), '', now(), '0', 'EV000001', '10.0.0.10', '1111');
-- harbor
INSERT INTO `specmgmt`.`Harbor` (`id`,`create_time`, `creator_id`, `update_time`, `updator_id`, `Scope_ID`, `Harbor_ID`, `IP`, `Status`)
VALUES (1,now(), '', now(), '0', 'EV000001', 'Harbor1', '10.0.0.12', 'Normal');
-- networkZone
INSERT INTO `specmgmt`.`NetworkZone` (`id`,`create_time`, `creator_id`, `update_time`, `updator_id`, `Scope_ID`, `NetworkZone_ID`, `NetworkZone_Name`, `Description`, `Status`)
VALUES (1,now(), '', now(), '0', 'EV000001', 'Serverfarm01', 'dl-sit', '', 'Normal');
-- mesh
INSERT INTO `specmgmt`.`Mesh` (`id`,`create_time`, `creator_id`, `update_time`, `updator_id`, `Scope_ID`, `Mesh_ID`, `Name`, `Role`, `Type`, `Property`, `Occupied`, `Status`, `Max_Connection`)
VALUES (1,now(), '0',now(), '0', 'EV000001', 'ktcdev-pem', 'ktcdev-pem', 'PEM', 'Single', 'Public', 'No', 'Normal', NULL);
-- meshNode
INSERT INTO `specmgmt`.`MeshNode` (`id`,`create_time`, `creator_id`, `update_time`, `updator_id`, `Scope_ID`, `IP`, `Role`, `Admin_Port`, `Worker_Port`, `Status`, `Router_Name`)
VALUES (1,now(), '0', now(), '0', 'EV000001', '10.10.0.95', 'Master', '28800', '28801', 'Normal', NULL);

-- env - networkZone
INSERT INTO `specmgmt`.`sys_object_relation` (`id`, `src_obj_id`, `tar_obj_id`, `src_ci_name`, `tar_ci_name`, `ref_name`, `version`, `create_time`, `creator_id`, `update_time`, `updator_id`, `data`)
VALUES (NULL, 77, 1, 'Environment', 'NetworkZone', 'Environment_Contain_NetworkZone', NULL, NOW(), NULL, NOW(), NULL, 'null'),
-- networkZone - apt
(NULL, 1, 1, 'NetworkZone', 'APT', 'NetworkZone_Related_APT', NULL, NOW(), NULL, NOW(), NULL, 'null'),
-- networkZone - harbor
(NULL, 1, 1, 'NetworkZone', 'Harbor', 'NetworkZone_Related_Harbor', NULL, NOW(), NULL, NOW(), NULL, 'null'),
-- networkZone - az
(NULL, 1, 77, 'NetworkZone', 'AvailableZone', 'NetworkZone_Related_AvailableZone', NULL, NOW(), NULL, NOW(), NULL, 'null'),
-- mesh meshNode
(NULL, 1, 1, 'Mesh', 'MeshNode', 'Mesh_Contain_MeshNode', NULL, '2021-09-06 21:56:59', NULL, '2021-09-06 21:56:59', NULL, NULL),
-- networkZone - Mesh
(NULL, 1, 1, 'NetworkZone', 'Mesh', 'NetworkZone_Related_Mesh', '', '2021-09-23 08:49:04', 0, '2021-09-23 08:49:04', 0, '{}');

NFS服务

NFS:Network File System 网络文件系统,基于内核的文件系统。Sun公司开发,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure Call Protocol远程过程调用)实现
RPC采用C/S模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行
NFS优势:节省本地存储空间,将常用的数据,如home目录,存放在NFS服务器上且可以通过网络访问,本地终端将可减少自身存储空间的使用

NFS文件系统

NFS工作原理

在这里插入图片描述

NFS各个版本的对比

NFS v2 NFS v3 NFS v4
只支持32位文件传输,最大文件数4G 支持64位文件传输 CentOS7默认很使用NFSv4版,实现伪根,辅助服务不需要,完全支持kerberos
文件传输尺寸限制在8K 没有文件尺寸限制
V3增加和完善了许多错误和成功信息的返回,对于服务器的设置和管理能带来很大好处 改进了INTERNET上的存取和执行效能,在协议中增强了安全方面的特性
只提供了对UDP协议的支持,在一些高要求的网络环境中有很大限制 增加了对TCP传输协议的支持,有更好的I/O 写性能. 只支持TCP传输,通过一个安全的带内系统,协商在服务器和客户端之间使用的安全性类型,使用字符串而不是整数来表示用户和组标识符

NFS服务介绍

软件包:nfs-utils
Kernel支持:nfs.ko
端口:2049(nfsd), 其它端口由portmap(111)分配

配置文件:/etc/exports,/etc/exports.d/*.exports
CentOS7不支持同一目录同时用nfs和samba共享,因为使用锁机制不同

相关软件包:rpcbind(必须),tcp_wrappers
CentOS6开始portmap进程由rpcbind代替

NFS服务主要进程: 说明
rpc.nfsd 最主要的NFS进程,管理客户端是否可登录
rpc.mountd 挂载和卸载NFS文件系统,包括权限管理
rpc.lockd 非必要,管理文件锁,避免同时写出错
rpc.statd 非必要,检查文件一致性,可修复文件

日志:/var/lib/nfs/

NFS配置文件

路径: /etc/exports
导出的文件系统的格式:
/dir 主机1(opt1,opt2) 主机2(opt1,opt2)...

  1. #开始为注释
  2. 主机格式:
    •单个主机:ipv4,ipv6,FQDN
    •IP networks:两种掩码格式均支持:172.18.0.0/16
    •wildcards:主机名通配,例如*.magedu.com,IP不可以
    •netgroups:NIS域的主机组,@group_name
    •anonymous:表示使用*通配所有客户端
  3. 每个条目指定目录导出到的哪些主机,及相关的权限和选项
    默认选项:(ro,sync,root_squash,no_all_squash)
    ro,rw 只读和读写
    async 异步,数据变化后不立即写磁盘,性能高
    sync 同步,数据在请求时立即写入共享
    no_all_squash 保留共享文件的UID和GID
    all_squash 所有远程用户(包括root)都变成nfsnobody
    root_squash 远程root映射为nfsnobody,UID为65534,
    no_root_squash 远程root映射成root用户
    anonuid=anongid= 指明匿名用户映射为特定用户UID和组GID,而非nfsnobody,可配合all_squash使用

示例:/data/nfsdir1 192.168.99.0/24(sync,rw,root_squash,all_squash)

NFS配置示例

注意[101]$开头是主机 192.168.99.101,[102]$开头的是主机192.168.99.102

  1. 修改配置

    1
    2
    [101]$ cat /etc/exports
    /data/nfsdir1 *(rw)
  2. 加载生效并查看

    1
    2
    3
    4
    [101]$ exportfs -r
    #查看条目
    [101]$ exportfs -v
    /data/nfsdir1 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
  3. 用102这台主机挂载下

    1
    2
    3
    4
    5
    6
    [102]$ mkdir /mnt/nfs1
    [102]$ mount 192.168.99.101:/data/nfsdir1 /mnt/nfs1
    [102]$ df
    Filesystem 1K-blocks Used Available Use% Mounted on
    ... ...
    192.168.99.101:/data/nfsdir1 5232640 341696 4890944 7% /mnt/nfs1
  4. 挂载创建个文件,结果发现权限不足

    1
    2
    [102]$ touch 102
    touch: cannot touch ‘102’: Permission denied
  5. 回到101,给这个目录设置FACL

    1
    [101]$ setfacl -m u:nfsnobody:rwx nfsdir1
  6. 可以看到,所创建的帐号是nfsnobody的

    1
    2
    3
    4
    [102]$ cd /mnt/nfs1 ; touch 102
    [102]$ ll
    total 4
    -rw-r--r-- 1 nfsnobody nfsnobody 0 Jul 27 17:31 102
  7. 其它是把102主机上的root的映射成了nfsnobody帐号了。这是因为在exportfs -v的输出中,有这么一句话”root_squash”,其它主机的root帐号会被压榨权限,压成nfsnobody

    1
    2
    [101]$ exportfs -v
    /data/nfsdir1 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
  8. 那如果是其它帐号呢,来试试

    1
    2
    3
    4
    5
    [102]$ su wang

    [wang@localhost nfs1]$ touch wang.file
    touch: cannot touch ‘wang.file’: Permission denied
    [wang@localhost nfs1]$
  9. 权限不足,这是因为wang帐号的id=1001,无法映射成nfsnobody,只有id=0的root帐号才能映射成nfsnobody,那如果想把所有的帐号都映射成nfsnobody呢?这样做

    1
    2
    3
    [101]$ vim /etc/exports
    /data/nfsdir1 *(rw,all_squash)
    [101]$ exportfs -r
  10. 这样就可以了,所创建的帐号就会被映射成nfsnobody了

    1
    2
    3
    4
    5
    [102]$ su wang

    [wang@localhost nfs1]$ touch wang.file
    [wang@localhost nfs1]$ ll
    -rw-rw-r-- 1 nfsnobody nfsnobody 0 Jul 27 17:45 wang.file
  11. 那能不能映射成其它帐号呢?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #一会我们就映射成test1这个帐号
    [101]$ useradd test1
    #注意,id=1001
    [101]$ id test1
    uid=1001(test1) gid=1001(test1) groups=1001(test1)

    #修改配置
    [101]$ cat /etc/exports
    /data/nfsdir1 *(rw,all_squash,anonuid=1001,anongid=1001)
    #加载
    [101]$ exportfs -r

    #设置FACL
    [101]$ setfacl -m u:test1:rwx nfsdir1

来102试试,为什么显示1001呢,因为102主机上没有id=1001的帐号

1
2
3
4
5
6
7
8
9
10
11
#root帐号
[102]$ touch root1
[102]$ ll
-rw-r--r-- 1 1001 1001 0 Jul 27 17:53 root1

#用wang
[102]$ su wang
[wang@localhost nfs1]$ touch wang2
[wang@localhost nfs1]$ ll
-rw-r--r-- 1 1001 1001 0 Jul 27 17:53 root1
-rw-rw-r-- 1 1001 1001 0 Jul 27 17:54 wang2

NFS其它配置示例

  1. 在/etc/exports文件中定义导出目录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /myshare server.example.com
    /myshare *.example.com
    /myshare server?.example.com
    /myshare server[0-20].example.com
    /myshare 172.25.11.10
    /myshare 172.25.0.0/16
    /myshare 2000:472:18:b51:c32:a21
    /myshare 2000:472:18:b51::/64
    /myshare *.example.com 172.25.0.0/16
    /myshare desktop.example.com(ro)
    /myshare desktop.example.com(ro) server[0-20].example.com(rw)
    /myshare diskless.example.com(rw,no_root_squash)

NFS工具

  1. rpcinfo

    1
    2
    rpcinfo -p hostname
    rpcinfo –s hostname #查看RPC注册程序
  2. exportfs [OPTIONS]

[OPTIONS] 说明
–v 查看本机所有NFS共享
–r 重读配置文件,并共享目录
–a 输出本机所有共享
–au 停止本机所有共享
  1. showmount -e 192.168.99.101 查看某个主机上的NFS
  2. mount.nfs 挂载工具

客户端NFS挂载

NFS相关的挂载选项:man 5 nfs

  1. fg(默认)前台挂载 | bg后台挂载
  2. hard(默认)持续请求 | soft 非持续请求
  3. intrhard配合,请求可中断
  4. rsizewsize 一次读和写数据最大字节数,rsize=32768
  5. _netdev 无网络不挂载

基于安全考虑,建议使用nosuid,nodev,noexec挂载选项

示例:

1
mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/

开机挂载:

1
2
[101]$ cat /etc/fstab 
172.16.0.1:/public /mnt/nfs nfs defaults 0 0

autofs自动挂载

可使用autofs按需要挂载NFS共享,在空闲时自动卸载

  1. yum安装方法yum install autofs
  2. 系统管理器指定由/etc/auto.master自动挂载器守护进程控制的挂载点
  3. 自动挂载监视器访问这些目录并按要求挂载文件系统
  4. 文件系统在失活的指定间隔5分钟后会自动卸载
  5. 为所有导出到网络中的NFS启用特殊匹配 -host 至“browse”
  6. 参看帮助:man 5 autofs
  7. 支持含通配符的目录名
    * server:/export/&

神奇目录

之前说到的光盘自动的神奇目录/misc/cd这个目录,只要进入这个目录就自动挂载光盘,这是怎么做到的呢

  1. 在配置文件里有这么一句

    1
    2
    3
    4
    5
    [101]$ cat /etc/auto.master
    ...
    /misc /etc/auto.misc
    ...
    #dirname #子配置文件位置
  2. 那这个子配置里面写了啥,看看

    1
    2
    3
    4
    5
    [101]$ cat /etc/auto.misc
    ...
    cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
    ...
    #basename -fstype=类型,选项 挂载的源

还有一个神奇目录
想要临时访问远程主机上的共享,不用挂载,直接进入/net/目录下加你要访问的远程IP的主机

1
2
3
4
[101]$ cd /net/192.168.99.103

[101]$ ls
data home

这是因为在配置文件里,有这么一句话

1
2
3
4
[101]$ cat /etc/auto.master
...
/net -hosts
...

绝对路径与相对路径

  1. 相对路径
    像上面神奇目录那样的写法就是相对路径的写法
    1
    2
    #把dirname写在/etc/auto.master下
    /misc /etc/auto.misc
    还可以这么写,*表示任意的字符串,后面的&表示前面*
    1
    *   -fstype=nfs,rw   192.168.99.103:/home/&

但写相对路径,会有一个问题,/misc下的所有目录都会消失。 这是因为/misc下的目录都由autofs接管。

1
2
[101]$ ls /home
wang

家目录下还有其它的用户,但是却看不到了。

怎么解决呢?用绝对路径

  1. 绝对路径
    master配置文件加上这条
    1
    2
    [101]$ cat /etc/auto.master
    /- /etc/auto.master.d/auto.home.wang
    在你写的子配置文件写
    1
    2
    [101]$ cat /etc/auto.master.d/auto.home.wang
    /home/wang -fstype=nfs,rw 192.168.99.103:/home/wang

记得写完重启服务

1
systemctl restart autofs