memcached优化方法及应用场景

memcached分布式

Memcached尽管是“分布式”的缓存系统,但服务器端并没有分布式功能。各个 Memcached不会互相通信以共享信息。分布式完全取决于客户端实现。
Memcached的分布式客户端
客户端可以通过配置SockIOPool的servers参数保存服务器地址列表,通过
weight参数配置每台服务器的权重。SockIOPool提供了连接池的服务,可以通过 SockIOPool来配置memcahce服务器相关信息,如最大连接数,最小连接数等。

一个key只能存放在一台Memcache服务器上,是不会在多个服务器上有多份拷贝的,这样的话既可以防止出现刷新不同步的情况,也可以避免磁盘空间的浪费

Memcached的分布式特点

1: 服务器端不关心分布式。

2: 依靠客户端来实现分布式 。

3: 客户端存储着可以访问到的Memcached服务器列表 。

4: 在客户端用算法来保证,对同样key值的数据,读写都操作同一个服务器。

Memcached 的调优的目标

  1. 提高内存利用率,减少内存浪费。

  2. 提高命中率。

调优方法:

  1. f参数:
    factor增长因子,默认为1.25,曾经为2,值越小,slab中chunk size差距 越小,内存浪费越小。1.25适合缓存几百字节的对象。
    建议:计算一下数据的预期平均长度,调整factor,以获得最恰当的设置。

  2. n参数:chunk初始值

  • slab尾部剩余空间
    解决办法:规划slab=chunk*n整数倍

  • slab中chunk利用率低:申请的slab只存放了一个Item
    解决办法:规划slab=chunk

  • chunk存储Item浪费
    如Item是100,存到128字节chunk,就有28字节浪费
    解决办法:规划chunk=Item

Memcached 的限制

  • 在Memcached中可以保存的item数据量是没有限制的,只要内存足够。

  • Memcached单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多
    个Memcached进程。

  • Memcached设置Item为最大30天的过期时间,设置为永久的也会在这个时间过期,
    常量REALTIME_MAXDELTA为606024*30控制。

  • Memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问
    题,当内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删
    除不使用的缓存。

  • 最大键长为250字节,大于该长度无法存储,单个item最大数据是1MB,超过1MB数据不予存储。

Memcached 的使用目的

通过缓存数据库查询结果,减少数据库访问次

数;还有就是缓存热点数据,以提高Web应用的速度、提高可扩展性。

  1. 缓存简单的查询结果:查询缓存存储了给定查询语句对应的整个结果集,最合适
    缓存那些经常被用到,但不会改变的SQL语句对应查询到的结果集,比如载入特
    定的过滤内容。

  2. 缓存简单的基于行的查询结果。

  3. 缓存的不只是SQL数据,可以缓存常用的热点数据,比如页面,以节省CPU时间使用分层的缓存。

  4. 特别注意:当数据更新时需要更新缓存。

Memcached 的典型使用场景

  1. 分布式应用。

  2. 数据库前段缓存。

  3. 服务器间数据共享。

  4. 变化频繁,查询频繁的数据,但是不一定写入数据库,比如:用户在线状态 。

  5. 变化不频繁,查询频繁,不管是否入库,都比较适合使用。

Memcached 不适合使用Memcached的场景

1: 变化频繁, 一变化就要入库类的应用,比如股票,金融。

2: 那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,
memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源。

3: 缓存对象的大小大于1MB。

4: key的长度大于250字符。

相关文章

Memcached 安装使用存储
http://www.jianshu.com/p/2b3c43c1778c

java 使用memcached以及spring 配置memcached
http://www.jianshu.com/p/6f264bf5d9f9

memcached优化
http://www.jianshu.com/p/789d208036f5

Centos7安装配置mariaDB + nginx + php-fpm环境

Centos7 搭建mariaDB + nginx + php环境

系统更新

  • 1.安装开启安装EPEL YUM源
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum makecache
  • 2.系统更新
[root@localhost ~]# yum update
  • 3.解决The remote SSH server rejected X11 forwarding request提示
[root@localhost ~]# yum install xorg-x11-xauth
# 编辑/etc/ssh/sshd_config文件中的X11Forwarding参数为yes
[root@localhost ~]# vim /etc/ssh/sshd_config
  • 4.安装编译组件和依赖
[root@localhost ~]# yum -y install gcc gcc-c++ make unixODBC wxBase wxGTK wxGTK-gl ncurses-devel zlib zlib-devel openssl openssl-devel kernel-devel m4 xmlto net-tools lksctp-tools socat cmake perl perl-JSON libtool pcre pcre-devel yasm yasm-devel libmcrypt libmcrypt-devel libvpx libvpx-devel tiff tiff-devel libpng libpng-devel freetype freetype-devel jpeg jpeg-devel libgd libgd-devel t1lib t1lib-devel gd gd-devel

修改主机名

  • 1.将/etc/hostname中的值修改为localhost或者其他主机名
[root@localhost ~]# vim /etc/hostname
  • 2.在/etc/sysconfig/network 中添加或者修改为HOSTNAME=localhost或者其他主机名
[root@localhost ~]# vim /etc/sysconfig/network
  • 3.将/etc/hosts 中各项值修改为localhost或者其他主机名
[root@localhost ~]# vim /etc/hosts
  • 4.临时修改主机名
[root@localhost ~]# hostname localhost

添加用户

添加新的用户账号使用useradd命令,其语法如下

useradd 选项 用户名

其中各选项含义如下:
代码:

  • -c comment 指定一段注释性描述。
  • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
  • -g 用户组 指定用户所属的用户组。
  • -G 用户组,用户组 指定用户所属的附加组。
  • -s Shell文件 指定用户的登录Shell。
  • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
  • 用户名 指定新账号的登录名

  • 1.添加nginx用户

[root@localhost ~]# groupadd nginx
[root@localhost ~]# useradd -c nginx -g nginx nginx -s /sbin/nologin
  • 2.添加网站专用wwwroot用户
[root@localhost ~]# groupadd www
[root@localhost ~]# useradd -c www -g www www -s /sbin/nologin

安装MARIADB

  • 1.使用yum命令安装mariaDB
[root@localhost]# yum -y install mariadb mariadb-server
  • 2.设置开机启动
[root@localhost ~]# systemctl enable mariadb
  • 3.启动MySQL服务
[root@localhost ~]# systemctl start mariadb
  • 4.MariaDB的相关简单配置
[root@localhost ~]# mysql_secure_installation
# 首先是设置密码,会提示先输入密码,初次运行直接回车
Enter current password for root (enter for none):
# 设置密码,是否设置root用户密码,输入y并回车或直接回车
Set root password? [Y/n]
# 设置root用户的密码
New password:
# 再输入一次你设置的密码
Re-enter new password:
# 其他配置
# 是否删除匿名用户,回车
Remove anonymous users? [Y/n]
# 是否禁止root远程登录,回车
Disallow root login remotely? [Y/n]
# 是否删除test数据库,回车
Remove test database and access to it? [Y/n]
# 是否重新加载权限表,回车
Reload privilege tables now? [Y/n]
# 初始化MariaDB完成,接下来测试登录
# mysql -uroot -proot密码
  • 5.授权远程用户登录
# 允许的IP地址,%为任意地址
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'IP地址' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

安装PHP

  • 1.安装php
[root@localhost ~]# yum -y install php php-devel
  • 2.安装php扩展
[root@localhost ~]# yum -y install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc
  • 3.安装php-fpm
# 安装 php-fpm
[root@localhost ~]# yum -y install php-fpm
# 设置fpm开机自启动
[root@localhost ~]# systemctl enable php-fpm
# 启动fpm
[root@localhost ~]# systemctl start php-fpm
# php-fpm配置文件路径/etc/php-fpm.conf

安装NGINX

  • 1.下载nginx
# 切换到src目录
[root@localhost ~]# cd /usr/local/src
# 下载nginx源码包
[root@localhost src]# wget http://nginx.org/download/nginx-1.12.0.tar.gz
# 解压并切换到nginx目录
[root@localhost src]# tar zxvf nginx-1.12.0.tar.gz
[root@localhost src]# cd nginx-1.12.0
# 配置编译选项
[root@localhost nginx-1.12.0]# ./configure --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-pcre
# 安装
[root@localhost nginx-1.12.0]# make & make install
  • 2.启动关闭nginx
# 常规启动、关闭和重启,不会改变启动时指定的配置文件
[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
# 设置开机自启动
[root@localhost ~]# vim /lib/systemd/system/nginx.service
# 写入以下内容
# --------------------------------------------------
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
# --------------------------------------------------
[root@localhost ~]# systemctl enable nginx
  • 3.添加php支持
# 修改nginx.conf,去掉以下代码的注释
        location ~ .php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }
# 重启nginx
[root@localhost]# /usr/local/nginx/sbin/nginx -s reload
  • 4.解决访问php提示File not found.
# 修改nginx配置文件
# 源文件
fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
# 修改后的文件,将 /scripts 修改为$document_root
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

centos7配置MariaDB允许指定IP远程连接数据库

前提

公司数据库没有版本控制,这个就相当坑爹了,问以前的技术,就是在本地建一个表,然后导入到线上,WTF。目前就只能临时开启远程连接数据了,后面在使用版本控制

防火墙

centos7 之前的防火墙是不一样的,比如你要添加3306端口:

 ## 全部
 iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

 ## 部分ipiptables
 iptables -A INPUT -p tcp -s 138.111.21.11 -dport 3306 -j ACCEP

 service iptables save

 service iptables restart

 ## 查看 iptables
 iptables -L -n

但这个在centos7 就不好使,查看文档才知道centos7 使用了增强版firewall

 firewall-cmd --zone=public --permanent --add-port=3306/tcp
  1、firwall-cmd:是Linux提供的操作firewall的一个工具;
  2、--permanent:表示设置为持久;
  3、--add-port:标识添加的端口;
  4、--zone=public:指定的zone为public;

当然如果不太习惯使用命令,我们可以直接改配置文件

MySQL

进入etc/firewalld/zone中,修改public.xml

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas.</description>
  <rule family="ipv4">
    <source address="122.10.70.234"/>
    <port protocol="udp" port="514"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="123.60.255.14"/>
    <port protocol="tcp" port="10050-10051"/>
    <accept/>
  </rule>
 <rule family="ipv4">
    <source address="192.249.87.114"/> 放通指定ip,指定端口、协议
    <port protocol="tcp" port="80"/>
    <accept/>
  </rule>
<rule family="ipv4"> 放通任意ip访问服务器的9527端口
    <port protocol="tcp" port="9527"/>
    <accept/>
  </rule>
</zone>

上述配置文件可以看出:

1、添加需要的规则,开放通源ip为122.10.70.234,端口514,协议tcp;
2、开放通源ip为123.60.255.14,端口10050-10051,协议tcp;/3、开放通源ip为任意,端口9527,协议

firewall 常用命令

# 重启
service firewalld restart 

# 开启
service firewalld start 

# 关闭
service firewalld stop

# 查看firewall 服务状态
 systemctl status firewall

# 查看防火墙
 firewall-cmd  --list-all    

MySQL

开启服务器3306对外开放后,还需要设置数据库用户授权

MariaDB 开启远程连接

在数据库mysql 中的user表中可以看到默认是只能本地连接的,所有可以添加一个用户

# 针对ip
create user 'root'@'192.168.10.10' identified by 'password';

#全部
 create user 'root'@'%' identified by 'password';

建议还是针对于ip开放吧,不要全部开放

授权用户:

 # 给用户最大权限
  grant all privileges on *.* to 'root'@'%' identified by 'password';

 # 给部分权限(test 数据库)

  grant all privileges on test.* to 'root'@'%' identified by 'password' with grant option;

# 刷新权限表

 flush privileges;

# show grants for 'root'@'localhost';

MySQL

接下来就是可以本地连接了

参考文章:

  • 防火墙:
    http://blog.csdn.net/xlgen157387/article/details/52672988

    http://blog.sina.com.cn/s/blog_4c197d4201017rgl.html

  • 用户授权:
    http://www.cnblogs.com/xujishou/p/6306765.html

CentOS安装配置MariaDB Galera Cluster集群

MariaDB Galera Cluster是MariaDB的同步多主集群。它仅在Linux上可用,并且仅支持xtraDB/InnoDB存储引擎,对MyISAM也有一定的支持(https://mariadb.com/kb/en/mariadb/galera-cluster-system-variables/#wsrep_replicate_myisam),

特征:

  • 同步复制
  • 多主可同时读写 Active-active multi-master
  • 任何节点成员可读写
  • 自动成员控制,故障节点从群集中删除
  • 节点可自动加入(基于配置)
  • 真正的并行复制,在行级复制
  • 使用者在客户端连接,在使用和感官上和mysql一样

优点:

  • 没有从库延迟
  • 不会丢失事物
  • 读写扩展高(后续文章会加入读写分离)
  • 多主,不存在slave 延迟,也不以来binlog
  • 具有同步复制,故障切换和重新同步的高可用性解决方案
  • 所有服务器都具有最新数据(无滞后)
  • 跨数据中心的高可用性

它依赖于wsrep API(https://launchpad.net/wsrep):

wsrep API定义了一组应用程序回调和复制库调用,以实现事务数据库和类似应用程序的同步写入复制。在从应用程序详细信息中抽象和分离复制实现。虽然此接口的主要目标是基于认证的多主机复制,但同样适用于异步和同步主/从复制。

它的复制过程也是基于认证的,基于WSREP API,大量的配置参考:

https://mariadb.com/kb/en/mariadb/galera-cluster-system-variables/#wsrep_replicate_myisam

Galera可以利用四个端口:

  • 3306 数据库端口
  • 4567 对于Galera Cluster复制,组播复制在此端口上同时使用UDP传输和TCP。
  • 4568 增量数据同步IST,节点下线、重启后使用该端口,增量同步数据,增量状态转移。
  • 4444 镜像数据传输SST,集群数据同步端口,全量同步,新节点加入时起作用

三台机器:10.0.1.49,10.10.240.113,10.0.1.61
其实用起来可以是这样的:

MySQL

前面使用LVS等进行调度,当然在中间可以使用中间件进行读写分离

I. yum安装选择

https://downloads.mariadb.org/mariadb/repositories/
centos7 yum如下:

[root@LinuxEA ~]# cat > /etc/yum.repos.d/mariadb.repo << EOF
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
[root@LinuxEA ~]# yum install socat MariaDB-Galera-server MariaDB-client rsync galera

其他版本tar包安装下载地址:
https://downloads.mariadb.org/mariadb-galera/+releases/

本次使用二进制安装:
mariadb-galera安装:http://download.nus.edu.sg/mirror/mariadb//mariadb-galera-10.0.30/bintar-linux-x86_64/mariadb-galera-10.0.30-linux-x86_64.tar.gz

galera安装:http://releases.galeracluster.com/centos/7/x86_64/galera-3-25.3.20-2.el7.x86_64.rpm

防火墙添加:

iptables -I INPUT 4 -p tcp -m tcp -m state --state NEW -m multiport --dports 3306,4444,4567,4568 -m comment --comment &quot;mariadb-galera&quot; -j ACCEPT

其他依赖包:

yum install socat MariaDB-client rsync galera lsof

文档参考

  • 编译参考:https://mariadb.com/kb/en/mariadb/installating-galera-from-source/
  • 理解参考:https://www.percona.com/blog/2014/09/01/galera-replication-how-to-recover-a-pxc-cluster/
  • 其他教程:https://severalnines.com/resources/tutorials/galera-cluster-mysql-tutorial
  • http://galeracluster.com/products/technology/
  • Galera Cluster 局限:https://mariadb.com/kb/en/mariadb/mariadb-galera-cluster-known-limitations/

II. node1

解压

[root@LinuxEA /data]# tar xf mariadb-galera-10.0.30-linux-x86_64.tar.gz -C /usr/local/
[root@LinuxEA /data]# cd /usr/local/
[root@LinuxEA /usr/local]# ln -s mariadb-galera-10.0.30-linux-x86_64/ mysql

安装

[root@LinuxEA /usr/local]# useradd mysql -s /sbin/nologin -M
[root@LinuxEA /usr/local]# mkdir -p /data/mysql 
[root@LinuxEA /usr/local]# chown -R mysql.mysql  /data/mysql 
[root@LinuxEA /usr/local]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql

复制启动脚本

[root@LinuxEA /usr/local]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@LinuxEA /usr/local]# systemctl enable mysqld
mysqld.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig mysqld on
[root@LinuxEA /usr/local]# 

安装jemalloc内存分配器

[root@LinuxEA /]# wget https://github.com/jemalloc/jemalloc/releases/download/4.2.1/jemalloc-4.2.1.tar.bz2
[root@LinuxEA /]# yum install -y gcc lsof
[root@LinuxEA /]# tar xf jemalloc-4.2.1.tar.bz2
[root@LinuxEA /]# cd jemalloc-4.2.1/
[root@LinuxEA /jemalloc-4.2.1]# ./configure
[root@LinuxEA /jemalloc-4.2.1]# make 
[root@LinuxEA /jemalloc-4.2.1]# make install

授权用户:

grant all privileges on *.* to 'tb'@'%' identified by 'password';
flush privileges;

III. 配置文件部分说明:

  1. wsrep_cluster_address=gcomm:// 如下:
    这条命令,gcomm://是一个特殊的参数,在启动第一台数据库时需要使用这个参数来启动,否则会启动失败

  2. wsrep_cluster_address=”gcomm://10.0.1.49,10.10.240.113,10.0.1.61″如下:
    gcomm://后的是集群成员的ip地址

  3. wsrep_sst_auth=tb:password如下:这里的sst需要安装lsof依赖包
    这个参数就是我们之前设定的用来同步的用户名和密码

  4. wsrep_node_name=’node1′ 如下:
    当前node

  5. wsrep_node_address=’10.0.1.49′ 如下:
    当前node ip地址

IV. 部分配置文件如下

galera

[galera]
##https://www.percona.com/doc/percona-xtradb-cluster/5.6/wsrep-system-index.html
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
#wsrep_cluster_address=&quot;gcomm://&quot;
wsrep_cluster_address=&quot;gcomm://10.0.1.49,10.10.240.113,10.0.1.61&quot;
wsrep_cluster_name='cluster'
wsrep_node_address='10.0.1.49'
wsrep_node_name='node1'
#wsrep_replicate_myisam=1
####wsrep_slave_threads = 8
#wsrep_slave_threads = 16
##wsrep_provider_options=&quot;gcs.fc_limit=512&quot;
#wsrep_provider_options=&quot;gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128;cert.log_conflicts=yes&quot;
##wsrep_notify_cmd='/data/galeranotify/galeranotify.py'
#wsrep_log_conflicts=1
#wsrep_forced_binlog_format=ROW
#wsrep_drupal_282555_workaround=1
#wsrep_max_ws_size=2147483647
##wsrep_dirty_reads=0 #当值是1的时候这个节点是只读节点
##wsrep_sst_method=[mysqldump|xtrabackup|xtrabackup-v2|rsync|rsync_wan]
#wsrep_sst_method=xtrabackup-v2
wsrep_sst_method=rsync
wsrep_sst_auth=tb:password

V. 启动第一台:

这里需要注意的是,第一次启动使用–wsrep-new-cluster,如果此时集群中这台故障,需要修改配置文件打开:wsrep_cluster_address=”gcomm://10.0.1.49,10.10.240.113,10.0.1.61″这一项,如过其他两天数据已经和这台不同步,这需要删除目录数据后进行同步恢复并加入集群

[root@LinuxEA /data/mysql]# /etc/init.d/mysqld start --wsrep-new-cluster

做一些简单的优化:

DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.db WHERE Db LIKE 'test%';
DROP DATABASE test;
UPDATE mysql.user SET password = password('abc123') WHERE user = 'root';

VI. 启动第二台:

第二台的mariadb安装完成后,直接删掉/data/mysql下的文件,从10.0.1.49同步

[root@LinuxEA-2 /data/mysql]# rm -rf *
[root@LinuxEA-2 /data/mysql]# /etc/init.d/mysqld start
Starting MySQL.170524 17:43:41 mysqld_safe Adding '/usr/local/lib/libjemalloc.so' to LD_PRELOAD for mysqld
170524 17:43:41 mysqld_safe Logging to '/data/mysql/mysql-error.log'.
170524 17:43:41 mysqld_safe Starting mysqld daemon with databases from /data/mysql
..........SST in progress, setting sleep higher.... SUCCESS! 

部分配置文件:

[galera]
##https://www.percona.com/doc/percona-xtradb-cluster/5.6/wsrep-system-index.html
wsrep_on=ON
wsrep_cluster_address=&quot;gcomm://10.0.1.49,10.10.240.113,10.0.1.61&quot;
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='cluster'
wsrep_node_address='10.0.1.61'
wsrep_node_name='node2'
#wsrep_replicate_myisam=1
#wsrep_node_name='node1'
#wsrep_replicate_myisam=1
####wsrep_slave_threads = 8
#wsrep_slave_threads = 16
##wsrep_provider_options=&quot;gcs.fc_limit=512&quot;
#wsrep_provider_options=&quot;gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128;cert.log_conflicts=yes&quot;
##wsrep_notify_cmd='/data/galeranotify/galeranotify.py'
#wsrep_log_conflicts=1
#wsrep_forced_binlog_format=ROW
#wsrep_drupal_282555_workaround=1
#wsrep_max_ws_size=2147483647
##wsrep_dirty_reads=0 #当值是1的时候这个节点是只读节点
##wsrep_sst_method=[mysqldump|xtrabackup|xtrabackup-v2|rsync|rsync_wan]
#wsrep_sst_method=xtrabackup-v2
wsrep_sst_method=rsync
wsrep_sst_auth=tb:password

VII. 启动第三台

同样删除/data/mysql下的文件,从10.0.1.49同步

[root@LinuxEA-3 /data/mysql]# rm -rf *
[root@LinuxEA-3 /data/mysql]# /etc/init.d/mysqld start
Starting MySQL.170524 18:58:34 mysqld_safe Adding '/usr/local/lib/libjemalloc.so' to LD_PRELOAD for mysqld
170524 18:58:34 mysqld_safe Logging to '/data/mysql/mysql-error.log'.
170524 18:58:34 mysqld_safe Starting mysqld daemon with databases from /data/mysql
.....SST in progress, setting sleep higher.. SUCCESS! 
[root@LinuxEA-3 /data/mysql]# 

部分配置文件:

[galera]
##https://www.percona.com/doc/percona-xtradb-cluster/5.6/wsrep-system-index.html
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=&quot;gcomm://10.0.1.49,10.10.240.113,10.0.1.49&quot;
#wsrep_cluster_address=&quot;gcomm://&quot;
wsrep_cluster_name='cluster'
wsrep_node_address='10.10.240.113'
wsrep_node_name='node3'
#wsrep_replicate_myisam=1
####wsrep_slave_threads = 8
#wsrep_slave_threads = 16
##wsrep_provider_options=&quot;gcs.fc_limit=512&quot;
#wsrep_provider_options=&quot;gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128;cert.log_conflicts=yes&quot;
##wsrep_notify_cmd='/data/galeranotify/galeranotify.py'
#wsrep_log_conflicts=1
#wsrep_forced_binlog_format=ROW
#wsrep_drupal_282555_workaround=1
#wsrep_max_ws_size=2147483647
##wsrep_dirty_reads=0 #当值是1的时候这个节点是只读节点
##wsrep_sst_method=[mysqldump|xtrabackup|xtrabackup-v2|rsync|rsync_wan]
#wsrep_sst_method=xtrabackup-v2
wsrep_sst_method=rsync
wsrep_sst_auth=tb:password

三台启动完成状态:

[root@LinuxEA /data/mysql]# mysql -e &quot;SHOW STATUS LIKE 'wsrep_cluster_size';&quot;
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Debian安装配置MariaDB Server

MySQL

介绍

这里我们用 MariaDB 代替 MySQL,MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可 MariaDB 的目的是完全兼容 MySQL,包括 API 和命令行,使之能轻松成为 MySQL 的代替品。

上面的都是书面语,我觉得 MariaDB 哪里好呢,首先 MySQL 分 CE(开发版)和 EE(企业版)区分了一部分用户,而且毕竟是 Orcale 的软件了,后期发展难免会有更大的区分。MariaDB 是完全由开源社区维护的,而且在功能开发上也更开放,光说国内,阿里云就有为其赞助了一位开发者——彭立勋,帮助完善复制功能并将 AliSQL 的优良特性合并入 MariaDB,最近腾讯云也赞助了一位开发者 —— 程斌(音译),帮助完善InnoDB 功能,并合并 TXSQL。可见 MariaDB 的开发生态其实非常棒,很活跃,一片生机勃勃。

MariaDB、MySQL 这样的数据库编译非常耗时而且编译很容易出错,所以使用编译好的版本无疑是最好的,设置页非常的方便。

安装

MariaDB 的软件源由官方提供,程序的质量和安全绝对是毋庸置疑的。

本教程适用于:

Debian 8 (Jessie) 支持安装 10.0~最新
Debian 9 (stretch) 支持安装 10.1~最新

教程以 10.2 版本为例,其他版本只需将下面的 10.2 修改为 10.1 10.0 即可

apt-get install software-properties-common
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8add-apt-repository 'deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.2/debian stretch main'

apt update
apt install mariadb-server

MariaDB 设置密码

MySQL

安装过程中,这里会提示设置数据库 Root 密码,需要连续输入两次。

设置

输入下面的命令,关闭一些不安全的设置:

mysql_secure_installation

首先输入密码,提出修改米啊嘛不修改,然后一路 y 即可。

  • 基本介绍:
    Enter current password for root (enter for none):
  • 解释:输入当前 root 用户密码,默认为空,直接回车。
    Set root password? [Y/n] y
  • 解释:要设置 root 密码吗?输入 y 表示愿意。
    Remove anonymous users? [Y/n] y
  • 解释:要移除掉匿名用户吗?输入 y 表示愿意。
    Disallow root login remotely? [Y/n] y
  • 解释:不想让 root 远程登陆吗?输入 y 表示愿意。
    Remove test database and access to it? [Y/n] y
  • 解释:要去掉 test 数据库吗?输入 y 表示愿意。
    Reload privilege tables now? [Y/n] y
  • 解释:想要重新加载权限吗?输入 y 表示愿意。

管理

systemctl restart mysql #重启
systemctl start mysql #启动
systemctl stop mysql #关闭
systemctl status mysql #检查状态

更新

运行下面的命令系统就会更新所有可以更新的软件包括 MariaDB

apt update
apt upgrade -y

配置MariaDB允许客户端远程连接

1、登陆mysql数据库

mysql -u root -p

查看user表

mysql> use mysql;
Database changed
mysql> select host,user,password from user;
+--------------+------+-------------------------------------------+
| host | user | password |
+--------------+------+-------------------------------------------+
| localhost | root | A731AEBFB621E354CD41BAF207D884A609E81F5E |
| 192.168.1.1 | root | A731AEBFB621E354CD41BAF207D884A609E81F5E |
+--------------+------+-------------------------------------------+
2 rows in set (0.00 sec)

可以看到在user表中已创建的root用户。host字段表示登录的主机,其值可以用IP,也可用主机名,

(1)有时想用本地IP登录,那么可以将以上的Host值改为自己的Ip即可

2、实现远程连接(授权法)

将host字段的值改为%就表示在任何客户端机器上能以root用户登录到mysql服务器,建议在开发时设为%。

update user set host = ’%’ where user = ’root’;

将权限改为ALL PRIVILEGES

mysql> use mysql;
Database changed
mysql> grant all privileges on . to root@'%' identified by "root";
Query OK, 0 rows affected (0.00 sec)
mysql>
+--------------+------+-------------------------------------------+
| host | user | password |
+--------------+------+-------------------------------------------+
| localhost | root | A731AEBFB621E354CD41BAF207D884A609E81F5E |
| 192.168.1.1 | root | A731AEBFB621E354CD41BAF207D884A609E81F5E |
| % | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
+--------------+------+-------------------------------------------+
3 rows in set (0.00 sec)

这样机器就可以以用户名root密码root远程访问该机器上的MySql.

3、实现远程连接(改表法)

use mysql;
update user set host = '%' where user = 'root';

这样在远端就可以通过root用户访问Mysql.

CentOS7 YUM安装MariaDB

https://downloads.mariadb.org/mariadb/repositories/#mirror=tuna&distro=CentOS&distro_release=centos7-amd64–centos7&version=10.2

1. 配置Yum安装库

Here is your custom MariaDB YUM repository entry for CentOS. Copy and paste it into a file under /etc/yum.repos.d/ (we suggest naming the file MariaDB.repo or something similar).

#MariaDB 10.2 CentOS repository list - created 2017-06-12 03:20 UTC
#http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-
gpgcheck=1

2.执行yum安装

After the file is in place, install MariaDB with:

sudo yum install MariaDB-server MariaDB-client

3.启动MariaDB

systemctl start mariadb

4.设置root用户密码

mysqladmin -u root -p password newpassword

后面的 newpassword是要设置的密码

CentOS系统硬盘使用LVM扩容的方法

LVM扩容时或新建vg时需要使用系列命令,各个命令的用法多样,本文介绍一个最省力的姿势。

一、首先创建一块新的分区:

fdisk  /dev/sda
p
n  
    p       #选择逻辑分区,如果没有,则首先创建扩展分区,然后再添加逻辑分区(硬盘:最多四个分区P-P-P-P或P-P-P-E)
    3       #分区号(从2开始),/dev/sda3
t
    3
    8e   #分区类型8e表示LVM分区
w        #写入分区表
partprobe   #重读分区表,重读失败则要重启
partx /dev/sda #查看当前硬盘的分区表及使用情况

二、创建PV,扩容VG、LV

pvcreate /dev/sda3
vgdisplay #查看当前已经存在的VG信息,以存在VG:VolGroup为例
vgextend VolGroup /dev/sda3    #扩展VolGroup
lvdisplay #查看已经存在的LV信息,以存在LV:lv_root为例
lvextend /dev/VolGroup/lv_root /dev/sda3 #扩展LV
#其他用法    lvextend –L 50G /dev/VolGroup/lv_root 
#其他用法    lvextend –L +20G /dev/VolGroup/lv_root 
#其他用法    lvextend /dev/mapper/VolGroup-lv_root -l +100%FREE /dev/sdb1
resize2fs /dev/VolGroup/lv_root #执行该重设大小,对于当前正在使用的lv_root有效
#注意:在Centos7.x中,文件系统格式是xfs时,使用xfs_growfs命令重设lv大小,如 xfs_growfs  /dev/mapper/centos-root
df –h #查看挂载情况,已经扩容

三、创建新LV

pvcreate /dev/sdb1
#partprobe
#pvdisplay
vgcreate vg_mqtag /dev/sdb1
#vgdisplay
lvcreate -n lvData -l 100%FREE vg_mqtag
#lvdisplay
mkfs.ext4 /dev/vg_mqtag/lvData
mount /dev/vg_mqtag/lvData /opt/
df -h
echo "/dev/mapper/vg_mqtag-lvData /opt              ext4      defaults       0   0" >> /etc/fstab

Linux LVM入门使用教程

逻辑卷管理LVM是一个多才多艺的硬盘系统工具。无论在Linux或者其他类似的系统,都是非常的好用。传统分区使用固定大小分区,重新调整大小十分麻烦。但是,LVM可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以让管理员弹性的管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据。可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。

LVM使用分层结构,如下图所示。

系统管理

图中顶部,首先是实际的物理磁盘及其划分的分区和其上的物理卷(PV)。一个或多个物理卷可以用来创建卷组(VG)。然后基于卷组可以创建逻辑卷(LV)。只要在卷组中有可用空间,就可以随心所欲的创建逻辑卷。文件系统就是在逻辑卷上创建的,然后可以在操作系统挂载和访问。

LVM测试说明

本文将介绍怎么在linux中创建和管理LVM卷。我们将会分成两个部分。第一个部分,我们首先要在一个硬盘上创建多个逻辑卷,然后将它们挂载在/lvm-mount目录。然后我们将要对创建好的卷调整大小。而第二部分,我们将会从另外一块硬盘增加额外的卷到LVM中。

准备磁盘分区

通过使用fdisk,创建磁盘分区。我们需要创建3个1G分区,注意,并不要求分区的大小一致。同样,分区需要使用‘8e’类型来使他们可用于LVM。

# fdisk /dev/sdb 
Command (m for help): n ## 新建
Command action
   e   extended
   p   primary partition (1-4)
p ## 主分区

Partition number (1-4): 1 ## 分区号
First cylinder (1-1044, default 1):  ## 回车用默认的1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): +1G ## 大小

Command (m for help): t ## 改变类型
Selected partition 1
Hex code (type L to list codes): 8e ## LVM 的分区代码
Changed system type of partition 1 to 8e (Linux LVM)

重复上面的操作来创建其他两个分区。分区创建完成后,我们应该有类似如下的输出:

# fdisk -l 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  8e  Linux LVM
/dev/sdb2             133         264     1060290   8e  Linux LVM
/dev/sdb3             265         396     1060290   8e  Linux LVM

准备物理卷(PV)

刚创建的分区是用来储存物理卷的。LVM可以使用不同大小的物理卷。

# pvcreate /dev/sdb1
# pvcreate /dev/sdb2
# pvcreate /dev/sdb3

使用下列命令检查物理卷的创建情况。下面截取部分输出。”/dev/sdb2″是一个新的”1.01 GiB”物理卷。

# pvdisplay
  --- NEW Physical volume ---
  PV Name               /dev/sdb2
  VG Name
  PV Size               1.01 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               jszvzz-ENA2-g5Pd-irhV-T9wi-ZfA3-0xo092

使用下列命令可以删除物理卷。

# pvremove /dev/sdb1

准备卷组(VG)

下列命令用来创建名为’volume-group1’的卷组,使用/dev/sdb1, /dev/sdb2 和 /dev/sdb3创建。

# vgcreate volume-group1 /dev/sdb1 /dev/sdb2 /dev/sdb3

使用下列命令可以来验证卷组。

# vgdisplay
  --- Volume group ---
  VG Name               volume-group1
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               3.02 GiB
  PE Size               4.00 MiB
  Total PE              774
  Alloc PE / Size       0 / 0
  Free  PE / Size       774 / 3.02 GiB
  VG UUID               bwd2pS-fkAz-lGVZ-qc7C-TaKv-fFUC-IzGNBK

从输出中,我们可以看见卷组的使用量/总量。物理卷给卷组提供空间。只要在这个卷组中还有可用空间,我们就可以随意创建逻辑卷。

使用下列命令删除卷组。

# vgremove volume-group1

创建逻辑卷(LV)

下列命令创建一个名为’1v1’、大小为100MB的逻辑卷。我们使用小分区减少执行时间。这个逻辑卷使用之前创建的卷组的空间。

# lvcreate -L 100M -n lv1 volume-group1

逻辑卷可使用lvdisplay命令查看。

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/volume-group1/lv1
  VG Name                volume-group1
  LV UUID                YNQ1aa-QVt1-hEj6-ArJX-I1Q4-y1h1-OFEtlW
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                100.00 MiB
  Current LE             25
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

现在逻辑卷已经准备好了,我们可以格式化和挂载逻辑卷,就像其它ext2/3/4分区一样!

# mkfs.ext4 /dev/volume-group1/lv1
# mkdir /lvm-mount
# mount /dev/volume-group1/lv1 /lvm-mount/

一旦逻辑卷挂载,我们就可以到挂载点 /lvm-mount/ 上读写了。要创建和挂载其它的逻辑卷,我们重复这个过程。

最后,使用lvremove我们可以删除逻辑卷。

# umount /lvm-mount/
# lvremove /dev/volume-group1/lv1

扩展一个LVM卷

调整逻辑卷大小的功能是LVM最有用的功能。这个部分会讨论我们怎么样扩展一个存在的逻辑卷。下面,我们将会扩展先前创建的逻辑卷‘lv1’扩大到200MB。

注意,调整逻辑卷大小之后,也需要对文件系统调整大小进行匹配。这个额外的步骤各不相同,取决于创建文件系统的类型。在本文中,我们使用’lv1’创建了ext4类型的文件系统,所以这里的操作是针对ext4文件系统的。(ext2/3文件系统也类同)。命令的执行顺序是很重要的。

首先,我们卸载掉lv1卷

# umount /lvm-mount/

然后,设置卷的大小为200M

# lvresize -L 200M /dev/volume-group1/lv1

接下来,检查磁盘错误

# e2fsck -f /dev/volume-group1/lv1

运行以下命令扩展文件系统以后,ext4信息就更新了。

# resize2fs /dev/volume-group1/lv1

现在,这个逻辑卷应该已经扩展到200MB了。我们检查LV的状态来验证。

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/volume-group1/lv1
  VG Name                volume-group1
  LV UUID                9RtmMY-0RIZ-Dq40-ySjU-vmrj-f1es-7rXBwa
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                200.00 MiB
  Current LE             50
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

现在,这个逻辑卷可以再次挂载,同样这个方法也可用于其他分区。

缩减一个LVM卷

这章节介绍缩减LVM卷大小的方法。命令的顺序同样重要。并且,下列命令对ext2/3/4文件系统同样有效。

注意减少逻辑卷的大小值若小于储存的数据大小,存储在后面的数据会丢失。

首先,卸载掉卷。

# umount /dev/volume-group1/lv1

然后,检测磁盘错误。

# e2fsck -f /dev/volume-group1/lv1

接下来缩小文件系统,更新ext4信息。

# resize2fs /dev/volume-group1/lv1 100M

完成以后,减少逻辑卷大小

# lvresize -L 100M /dev/volume-group1/lv1
WARNING: Reducing active logical volume to 100.00 MiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce lv1? [y/n]: y Reducing logical volume lv1 to 100.00 MiB Logical volume lv1 successfully resized

最后,验证调整后的逻辑卷大小。

# lvdisplay
--- Logical volume ---
  LV Name                /dev/volume-group1/lv1
  VG Name                volume-group1
  LV UUID                9RtmMY-0RIZ-Dq40-ySjU-vmrj-f1es-7rXBwa
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                100.00 MiB
  Current LE             25
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

扩展一个卷组

本节将讨论扩展卷组的方法,将一个物理卷添加到卷组。让我们假设我们的卷组’volume-group1’已经满了,需要扩大。手上的硬盘(sdb)已经没有其他空闲分区,我们添加了另外一个硬盘(sdc)。我们将看到如何把sdc的分区添加到卷组以扩展。

检测现在卷组状态

# vgdisplay volume-group1
 --- Volume group ---
  VG Name               volume-group1
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  8
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               3.02 GiB
  PE Size               4.00 MiB
  Total PE              774
  Alloc PE / Size       25 / 100.00 MiB
  Free  PE / Size       749 / 2.93 GiB
  VG UUID               bwd2pS-fkAz-lGVZ-qc7C-TaKv-fFUC-IzGNBK

首先,我们创建一个2GB分区sdc1,类型为LVM(8e),如教程前所述。

# fdisk /dev/sdc
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1044, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): +2G

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

然后,我们创建一个物理卷 /dev/sdc1

# pvcreate /dev/sdc1

现在,物理卷已经准备好了,我们可以简单地将它增加到已存在的卷组’volume-group1’上。

# vgextend volume-group1 /dev/sdc1

使用vgdisplay来验证(可以看到卷组大小已经增大)。

# vgdisplay
  --- Volume group ---
  VG Name               volume-group1
  System ID
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  9
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               5.03 GiB
  PE Size               4.00 MiB
  Total PE              1287
  Alloc PE / Size       25 / 100.00 MiB
  Free  PE / Size       1262 / 4.93 GiB
  VG UUID               bwd2pS-fkAz-lGVZ-qc7C-TaKv-fFUC-IzGNBK

注意,尽管我们使用一个单独的磁盘做示范,其实只要是‘8e’类型的磁盘分区都可以用来扩展卷组。

总结一下,LVM是一个非常给力的工具,用来创建和管理可变大小的分区。本文中,我们已经介绍了动态分区如何在LVM中创建和使用。我们也介绍了扩展/缩小逻辑卷和卷组的方法,和如何增加一个新的磁盘到LVM。

Linux的logrotate日志轮询原理介绍

对于Linux系统安全来说,日志文件是极其重要的工具。不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过!logrotate程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间。下面就对logrotate日志轮转操作做一梳理记录:

1. 配置文件介绍

Linux系统默认安装logrotate工具,它默认的配置文件在:

/etc/logrotate.conf
/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。
另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。

Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的。
实际运行时,Logrotate会调用配置文件/etc/logrotate.conf。
可以在/etc/logrotate.d目录里放置自定义好的配置文件,用来覆盖Logrotate的缺省值。

[root@huanqiu_web1 ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf &gt;/dev/null 2&gt;&amp;1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要

# /usr/sbin/logrotate -f /etc/logrotate.d/nginx
# /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx

logrotate命令格式:

logrotate [OPTION...] 
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。

根据日志切割设置进行操作,并显示详细信息

[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.conf 
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.d/php

根据日志切割设置进行执行,并显示详细信息,但是不进行具体操作,debug模式

[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.conf 
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.d/nginx

查看各log文件的具体执行情况

[root@fangfull_web1 ~]# cat /var/lib/logrotate.status

2. 切割介绍

比如以系统日志/var/log/message做切割来简单说明下:
第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;
第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志!
如果仅设定保留三个日志(即轮转3次)的话,那么执行第三次时,则 messages.3这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。
日志究竟轮换几次,这个是根据配置文件中的dateext 参数来判定的。

看下logrotate.conf配置:

# cat /etc/logrotate.conf
# 底下的设定是 "logrotate 的默认值" ,如果別的文件设定了其他的值,
# 就会以其它文件的设定为主
weekly          //默认每一周执行一次rotate轮转工作
rotate 4       //保留多少个日志文件(轮转几次).默认保留四个.就是指定日志文件删除之前轮转的次数,0 指没有备份
create         //自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志
dateext       //这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式
compress      //是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行

include /etc/logrotate.d
# 将 /etc/logrotate.d/ 目录中的所有文件都加载进来

/var/log/wtmp {                 //仅针对 /var/log/wtmp 所设定的参数
monthly                    //每月一次切割,取代默认的一周
minsize 1M              //文件大小超过 1M 后才会切割
create 0664 root utmp            //指定新建的日志文件权限以及所属用户和组
rotate 1                    //只保留一个日志.
}
# 这个 wtmp 可记录用户登录系统及系统重启的时间
# 因为有 minsize 的参数,因此不见得每个月一定会执行一次喔.要看文件大小。

由这个文件的设定可以知道/etc/logrotate.d其实就是由/etc/logrotate.conf 所规划出来的目录,虽然可以将所有的配置都写入/etc/logrotate.conf ,但是这样一来这个文件就实在是太复杂了,尤其是当使用很多的服务在系统上面时, 每个服务都要去修改/etc/logrotate.conf的设定也似乎不太合理了。
所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中

其他重要参数说明:

  • compress 通过gzip 压缩转储以后的日志
  • nocompress 不做gzip压缩处理
  • copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
  • nocopytruncate 备份日志文件不过不截断
  • create mode owner group 轮转时指定创建新文件的属性,如create 0777 nobody nobody
  • nocreate 不建立新的日志文件
  • delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
  • nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
  • missingok 如果日志丢失,不报错继续滚动下一个日志
  • errors address 专储时的错误信息发送到指定的Email 地址
  • ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
  • notifempty 当日志文件为空时,不进行轮转
  • mail address 把转储的日志文件发送到指定的E-mail 地址
  • nomail 转储时不发送日志文件
  • olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
  • noolddir 转储后的日志文件和当前日志文件放在同一个目录下
  • sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
  • prerotate 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
  • postrotate 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
  • daily 指定转储周期为每天
  • weekly 指定转储周期为每周
  • monthly 指定转储周期为每月
  • rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
  • dateext 使用当期日期作为命名格式
  • dateformat .%s 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
  • size(或minsize) log-size 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
  • 当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
  • size = 5 或 size 5 (>= 5 个字节就转储)
  • size = 100k 或 size 100k
  • size = 100M 或 size 100M

小示例:下面一个切割nginx日志的配置

[root@master-server ~]# vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
daily
rotate 7
missingok
notifempty
dateext
sharedscripts
postrotate
    if [ -f /usr/local/nginx/logs/nginx.pid ]; then
        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    fi
endscript
}

分享一例曾经使用过的nginx日志切割处理脚本

2.1 logrotate日志分割配置:

[root@bastion-IDC ~# vim /etc/logrotate.d/nginx
/data/nginx_logs/*.access_log        
{
nocompress                                   
daily                                  
copytruncate                                  
create                              
ifempty                                   
olddir /data/nginx_logs/days           
rotate 0                                        
}

2.2 日志分割脚本

[root@bastion-IDC ~# vim /usr/local/sbin/logrotate-nginx.sh
#!/bin/bash
#创建转储日志压缩存放目录
mkdir -p /data/nginx_logs/days
#手工对nginx日志进行切割转换
/usr/sbin/logrotate -vf /etc/logrotate.d/nginx
#当前时间
time=$(date -d "yesterday" +"%Y-%m-%d")
#进入转储日志存放目录
cd /data/nginx_logs/days
#对目录中的转储日志文件的文件名进行统一转换
for i in $(ls ./ | grep "^(.*).[[:digit:]]$")
do
mv ${i} ./$(echo ${i}|sed -n 's/^(.*).([[:digit:]])$/1/p')-$(echo $time)
done
#对转储的日志文件进行压缩存放,并删除原有转储的日志文件,只保存压缩后的日志文件。以节约存储空间
for i in $(ls ./ | grep "^(.*)-([[:digit:]-]+)$")
do
tar jcvf ${i}.bz2 ./${i}
rm -rf ./${i}
done
#只保留最近7天的压缩转储日志文件
find /data/nginx_logs/days/* -name "*.bz2" -mtime 7 -type f -exec rm -rf {} ;

2.3 crontab定时执行

[root@bastion-IDC ~# crontab -e
#logrotate
0 0 * * * /bin/bash -x /usr/local/sbin/logrotate-nginx.sh &gt; /dev/null 2&gt;&amp;1

手动执行脚本,测试下看看:

[root@bastion-IDC ~# /bin/bash -x /usr/local/sbin/logrotate-nginx.sh
[root@bastion-IDC ~# cd /data/nginx_logs/days
[root@bastion-IDC days# ls
huantest.access_log-2017-01-18.bz2

php脚本

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/php
/Data/logs/php/*log {
    daily
    rotate 365
    missingok
    notifempty
    compress
    dateext
    sharedscripts
    postrotate
        if [ -f /Data/app/php5.6.26/var/run/php-fpm.pid ]; then
            kill -USR1 `cat /Data/app/php5.6.26/var/run/php-fpm.pid`
        fi
    endscript
    postrotate
        /bin/chmod 644 /Data/logs/php/*gz
    endscript
}

[root@huanqiu_web1 ~]# ll /Data/app/php5.6.26/var/run/php-fpm.pid
-rw-r--r-- 1 root root 4 Dec 28 17:03 /Data/app/php5.6.26/var/run/php-fpm.pid

[root@huanqiu_web1 ~]# cd /Data/logs/php
[root@huanqiu_web1 php]# ll
total 25676
-rw-r--r-- 1 root   root         0 Jun  1  2016 error.log
-rw-r--r-- 1 nobody nobody     182 Aug 30  2015 error.log-20150830.gz
-rw-r--r-- 1 nobody nobody     371 Sep  1  2015 error.log-20150901.gz
-rw-r--r-- 1 nobody nobody     315 Sep  7  2015 error.log-20150907.gz
.........
.........

nginx日志

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/nginx
/Data/logs/nginx/*/*log {
    daily
    rotate 365
    missingok
    notifempty
    compress
    dateext
    sharedscripts
    postrotate
    /etc/init.d/nginx reload
    endscript
}

[root@huanqiu_web1 ~]# ll /Data/logs/nginx/www.huanqiu.com/
..........
-rw-r--r-- 1 root root      1652 Jan  1 00:00 error.log-20170101.gz
-rw-r--r-- 1 root root      1289 Jan  2 00:00 error.log-20170102.gz
-rw-r--r-- 1 root root      1633 Jan  3 00:00 error.log-20170103.gz
-rw-r--r-- 1 root root      3239 Jan  4 00:00 error.log-20170104.gz

系统日志

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2&gt; /dev/null` 2&gt; /dev/null || true
    endscript
}

[root@huanqiu_web1 ~]# ll /var/log/messages*
-rw------- 1 root root 34248975 Jan 19 18:42 /var/log/messages
-rw------- 1 root root 51772994 Dec 25 03:11 /var/log/messages-20161225
-rw------- 1 root root 51800210 Jan  1 03:05 /var/log/messages-20170101
-rw------- 1 root root 51981366 Jan  8 03:36 /var/log/messages-20170108
-rw------- 1 root root 51843025 Jan 15 03:40 /var/log/messages-20170115
[root@huanqiu_web1 ~]# ll /var/log/cron*
-rw------- 1 root root 2155681 Jan 19 18:43 /var/log/cron
-rw------- 1 root root 2932618 Dec 25 03:11 /var/log/cron-20161225
-rw------- 1 root root 2939305 Jan  1 03:06 /var/log/cron-20170101
-rw------- 1 root root 2951820 Jan  8 03:37 /var/log/cron-20170108
-rw------- 1 root root 3203992 Jan 15 03:41 /var/log/cron-20170115
[root@huanqiu_web1 ~]# ll /var/log/secure*
-rw------- 1 root root  275343 Jan 19 18:36 /var/log/secure
-rw------- 1 root root 2111936 Dec 25 03:06 /var/log/secure-20161225
-rw------- 1 root root 2772744 Jan  1 02:57 /var/log/secure-20170101
-rw------- 1 root root 1115543 Jan  8 03:26 /var/log/secure-20170108
-rw------- 1 root root  731599 Jan 15 03:40 /var/log/secure-20170115
[root@huanqiu_web1 ~]# ll /var/log/spooler*
-rw------- 1 root root 0 Jan 15 03:41 /var/log/spooler
-rw------- 1 root root 0 Dec 18 03:21 /var/log/spooler-20161225
-rw------- 1 root root 0 Dec 25 03:11 /var/log/spooler-20170101
-rw------- 1 root root 0 Jan  1 03:06 /var/log/spooler-20170108
-rw------- 1 root root 0 Jan  8 03:37 /var/log/spooler-20170115

tomcat日志

[root@huanqiu-backup ~]# cat /etc/logrotate.d/tomcat
/Data/app/tomcat-7-huanqiu/logs/catalina.out {
rotate 14
daily
copytruncate
compress
notifempty
missingok
}

[root@huanqiu-backup ~]# ll /Data/app/tomcat-7-huanqiu/logs/catalina.*
-rw-r--r--. 1 root root     0 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out
-rw-r--r--. 1 root root 95668 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out.1.gz

早期用过的nginx日志

[root@letv-backup ~]# vim /letv/sh/cut_nginx_log.sh
#!/bin/bash
# 你的日志文件存放目录
logs_path="/letv/logs/"
# 日志文件的名字,多个需要空格隔开
logs_names=(error access pv_access)
dates=`date -d "yesterday" +"%Y%m%d"`
mkdir -p ${logs_path}$dates/
num=${#logs_names[@]}
for((i=0;i /dev/null 2&gt;$1

3. 尝试解决logrotate无法自动轮询日志的办法

现象说明:
使用logrotate轮询nginx日志,配置好之后,发现nginx日志连续两天没被切割,这是为什么呢??
然后开始检查日志切割的配置文件是否有问题,检查后确定配置文件一切正常。
于是怀疑是logrotate预定的cron没执行,查看了cron的日志,发现有一条Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)这样的日志,证明cron在04:02分时已经执行/etc/cron.daily目录下的程序。
接着查看/etc /cron.daily/logrotate(这是logrotate自动轮转的脚本)的内容:

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf &gt;/dev/null 2&gt;&amp;1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

没有发现异常,配置好的日志轮转操作都是由这个脚本完成的,一切运行正常,脚本应该就没问题。
直接执行命令:

[root@huanqiu_test ~]# /usr/sbin/logrotate /etc/logrotate.conf

这些系统日志是正常轮询了,但nginx日志却还是没轮询

接着强行启动记录文件维护操作,纵使logrotate指令认为没有需要,应该有可能是logroate认为nginx日志太小,不进行轮询。
故需要强制轮询,即在/etc/cron.daily/logrotate脚本中将 -t 参数替换成 -f 参数

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf &gt;/dev/null 2&gt;&amp;1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

最后最后重启下cron服务:

[root@huanqiu_test ~]# /etc/init.d/crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]

logrotate的日志每天切割都是默认在凌晨3点进行,现在需要将切割时间调整到每天的晚上12点,即每天切割的日志是前一天的0-24点之间的内容。
按照下面的方法几乎做到了安全按照每天来清晰的分隔日志:

1. 去掉了/etc/cron.daily/logrotate 
2. 直接crontab -e
#log logrotate
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx &gt;/dev/null 2&gt;&amp;1
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/tomcat &gt;/dev/null 2&gt;&amp;1
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/syslog &gt;/dev/null 2&gt;&amp;1