CentOS 7 里使用自动化运维工具Ansible

PS:开源的自动化运维部署工具,在以前的项目中应用过Puppet,研发部门也开发过一套自动化部署系统(主要基于java在web界面调用shell脚本部署),使用过程中都有各种不满意。最近尝试一个新一点的Ansible,发现非常好用。配置简单,功能强大。

一、简介与优点

1、ansible是为类Unix系统开发的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、SaltStack、chef等)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

2、Puppet、SaltStack、Chef这三个都采用C/S模式,每台被控机器都需要安装客户端,对于数量在数百台以上的机器上部署仍然有些麻烦。相比之下,Ansible无需安装服务端和客户端,只要SSH 验证即可。典型的“去中心化”思想。

3、使用简单,快速上手。以前在用Puppet之前,花了时间研究。本来使用Puppet就是想把自己从重复的事情中解放出来,结果为了简化一件事,而深入另一件复杂的事。

4、配置文件易读。Ansible 的主机定义文件使用 INI 格式,支持分组,能够指定模式;此外也能动态生成,这对管理云主机很有用。Playbook是YAML格式,比Puppet的DSL要易读易写很多。

二、安装与基本使用

1、安装:
Ansible默认不在yum的默认库中,需要启用epel库。(建议用阿里云的库,下载速度最快。)

# cd /etc/yum.repos.d/
# wget http://mirrors.aliyun.com/repo/epel-7.repo
# yum install ansible -y

2、设置用于节点鉴权的SSH密钥:
在Ansible服务端生成密钥,并且复制密钥到各个被控节点中。

# ssh-keygen
# ssh-copy-id -i [email protected]

3、为Ansible定义节点清单
节点维护清单在配置文件/etc/ansible/hosts 里面。

[16-servers]
10.36.16.12
10.36.16.15
10.36.16.16
10.36.16.17
10.36.16.18
10.36.16.19
10.36.16.20
10.36.16.21
10.36.16.22

4、基本使用:
检查16-servers节点组的连通性:

ansible 16-servers -m ping

检查16-servers节点组的内核版本:

ansible 16-servers -m shell -a "uname -a"

检查16-servers节点组的磁盘使用情况并把结果输出到本地指定文件:

ansible 16-servers -m shell -a "df -Th" > /root/df.txt

5、常用模块用法:
shell和command的区别:shell模块支持管道符和变量等特殊字符,而command不支持。

command模块(执行远程命令)

ansible 16-servers -m command -a "uname -a"

shell模块(执行远程主机的shell/python脚本)

ansible 16-servers -m shell -a "/root/xxx.py"

script模块(在远程主机执行主控端的shell/python脚本)

ansible 16-servers -m script -a "/root/xxx.py"

raw模块(类似于command模块、支持管道传递)

ansible 16-servers -m raw -a "netstat -na|grep ESTABLISHED|wc -l"

先说这些了,更详细用法请参考官方文档:

http://docs.ansible.com/

linux centos下彻底删除文件 解决删除文件文件夹硬盘空间不释放不减少

最近删除一个比较大的文件发现空间没有减少,在网上查阅资料是删除后,因为还有人使用,空间没有释放。

0. 查看剩余空间

[root@xy ~]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda3             9.7G  805M  8.4G   9% /
/dev/sda6             199G  143G   47G  76% /usr
/dev/sda2              48G  309M   45G   1% /home
/dev/sda1              99M   12M   83M  12% /boot

1. 查看删除后没有释放的程序和文件

#lsof |grep delete



mysqld     2885     mysql  139u      REG        8,6 3909479780    7634958 /usr/local/mysql/data/xxx.MYD (deleted)

mysqld     2885     mysql  140u      REG        8,6  893916160    7634977 /usr/local/mysql/data/sms_client/yyy.MYI (deleted)

mysqld     2885     mysql  141u      REG        8,6 3179710840    7634978 /usr/local/mysql/data/sms_client/zzz.MYD (deleted)

2. kill掉这个程序.

# kill -9 2885

3. 查看删除后的空间

[root@xy ~]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda3             9.7G  805M  8.4G   9% /
/dev/sda6             199G   24G  165G  13% /usr
/dev/sda2              48G  309M   45G   1% /home
/dev/sda1              99M   12M   83M  12% /boot
tmpfs                 2.0G     0  2.0G   0% /dev/shm

centos 7.1下制作google镜像站

一、首先用xshell链接vps

(有个人免费版的,到官网注册即可下载)

未分类

未分类

联网后输入命令:

ifconfig

查看本机外网ip,记录后备用:

未分类

二、下面进行配置

1.下载文件:

yum install -y gcc gcc-c++ git make
wget "http://nginx.org/download/nginx-1.7.8.tar.gz"
wget "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz"
wget "https://www.openssl.org/source/openssl-1.0.1j.tar.gz"
wget "https://www.openssl.org/source/openssl-1.0.1j.tar.gz"
wget "http://zlib.net/zlib-1.2.11.tar.gz"
git clone https://github.com/cuber/ngx_http_google_filter_module
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module

2.解压文件:

tar xzvf nginx-1.7.8.tar.gz 
tar xzvf pcre-8.38.tar.gz 
tar xzvf openssl-1.0.1j.tar.gz 
tar xzvf zlib-1.2.11.tar.gz

3.进入nginx源码文件夹:

cd nginx-1.7.8

4.设置编译选项:

./configure --prefix=/opt/nginx-1.7.8 --with-pcre=../pcre-8.38 --with-openssl=../openssl-1.0.1j --with-zlib=../zlib-1.2.11 --with-http_ssl_module --add-module=../ngx_http_google_filter_module --add-module=../ngx_http_substitutions_filter_module

5.编译、安装:

make
sudo make install

6.接下来启动, 测试安装是否成功:

/opt/nginx-1.7.8/sbin/nginx -t

未分类

7.进入conf文件编辑:

vi /opt/nginx-1.7.8/conf/nginx.conf

按a键可以进行编辑,坐下角会出现insert标志,这是linux基本的命令。按ESC后,输入:wq是保存并退出,输入:q!是不保存退出。

未分类

8.将conf文件中server部分修改如下:

server {
    listen       80;
    server_name  www.abc.com;#此处换成该vps的外网ip(前一步得到的那个),或者自己的网址
     location / {
        proxy_pass https://www.google.com;
        proxy_connect_timeout 120;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        send_timeout 600;
        proxy_redirect    off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        google on;
        google_language "zh-CN";
       }
  }

ESC后输入保存并退出文件的命令:

未分类

9.启动nginx

/opt/nginx-1.7.8/sbin/nginx -c /opt/nginx-1.7.8/conf/nginx.conf

如果此时nginx已经启动,得重新加载一次

/opt/nginx-1.7.8/sbin/nginx -s reload

至此在本地浏览器输入vps的ip地址,已经可以访问google了

未分类

ansible批量推送公钥

1.使用 ssh-keygen -t rsa生成密钥对

ssh-keygen -t rsa

2.推送单个公钥到远程机器

格式: ssh-copy-id -i ~/.ssh/id_rsa.pub username@[ip,hostname]

ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

3.添加ansible hosts

编辑/etc/ansible/hosts,没有则创建些文件。

格式:【主机名】 【主机地址】 【主机密码】 默认是root用户来进行的

[tomcat-servers]
1 ansible_ssh_user="tomcat"  ansible_ssh_host=192.168.100.1 ansible_ssh_pass="test"
2 ansible_ssh_user="tomcat"  ansible_ssh_host=192.168.100.2 ansible_ssh_pass="test"

新版的ansible(2.4) hosts有更新, 用以下方式:

[tomcat-servers]
192.168.100.1   ansible_user=tomcat  ansible_ssh_pass="test"
192.168.100.2   ansible_user=tomcat  ansible_ssh_pass="test"

4.批量推送公钥到远程机器

机器多的情况下,使用ssh-copy-id方法有些费时,使用ansible-playbook推送ymal,这里使用到了authoried_keys模块,可以参考官方文档http://docs.ansible.com/authorized_key_module.html

将以下文件命名为:push.ssh.ymal

 # Using alternate directory locations:
  - hosts: tomcat-servers
    user: tomcat (互信用户)
    tasks:
     - name: ssh-copy
       authorized_key: user=tomcat(互信用户) key="{{ lookup('file', '/home/tomcat/.ssh/id_rsa.pub(master端公钥)') }}"
       tags:
         - sshkey

5.执行推送命令

ansible-playbook push.ssh.ymal -f 10 (并发数)

6.如若报错,解决

Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

修改host_key_checking(默认是check的):

vi /home/xiangdong/ansible/ansible.cfg
# uncomment this to disable SSH key host checking
host_key_checking = False

7.测试

#查看各机器时间
ansible all -a date
#ansible all -m command -a date # 作用同上

#ping
 ansible all -m ping

输出结果:

$ ansible all  -m ping 
192.168.100.1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Gitlab通过Webhook实现Push代码后Jenkins自动构建

1. 生成Gitlab的Access Token

点击用户下面的Settings, 如下图

未分类

再点击Access Tokens, 填写Name, 点击Create personal access token 生成Access Token

未分类

2. Jenkins安装插件

需要安装GitLab Plugin, Gitlab Hook Plugin

3. 在Jenkins中配置Gitlab API token

点击系统设置

未分类

填写Connection name, 如gitlab.abc.com
填写Gitlab host URL, 如 http://gitlab.abc.com

未分类

点击Add按钮,在弹出框中填写步骤1生成的Access Token

未分类

4. 配置源码管理

Repository URL示例: [email protected]:gopher/demo.git

未分类

点击Add按钮,在弹出框中按下图填写。注意:jenkins所在的机器上要先生成公钥、私钥,且在用户目录下。

未分类

5. 生成回调地址和Secret Token

在构建触发器中选中Build when a change is pushed to GitLab,GitLab webhook URL即是回调地址,如下图中红线处,例如: http://jenkins.abc.com/project/demo

未分类

再点击上图中的高级按钮,这时会出现高级选项, 如下图,点击Generate按钮生成Secret Token

未分类

6. 配置Gitlab的webhook

假如GItlab中有一个项目demo,那么先进入这个项目,然后,再点击Settings >> Integrations

未分类

填写步骤5中生成的回调地址,和Secret Token, 再点击Add Webhook创建Webhook, 最后点击test测试下是否配置成功.

未分类

使用docker搭建gitlab初体验+数据备份

一. 背景

作为程序员,像GitHub这种好工具是必须得十分了解的,但是有时GitHub并不能满足我们所有的需求,就如作者所在的公司,我们的代码都是商业性的产品,不可能放到GitHub的开放仓库中的,而申请GitHub私人仓库需要钱。这就陷入了尴尬的局面,那有没有一种既能具有GitHub一样的功能,又能保护隐私免费的管理工具呢?答案是肯定的,感谢程序员伟大的开源精神,我们有了GitLab!!!今天笔者在这里就跟大家分享一下自己使用docker搭建GitLab的过程吧,这其中踩了一些坑,希望看过这篇文章的人不用在踩我踩过的坑了!

二. 环境介绍

服务器信息:

CPU : 2
DISK : 30G
RAM : 4G
OS : Linux centos7-0 3.10.0-229.el7.x86_64

这里笔者使用的是自己公司的服务器,也可以使用虚拟机进行搭建

三. 搭建过程

1. 安装docker

因为我们是使用docker搭建的,所以需要先安装docker,docker支持不同的OS,具体的安装信息这里不做详细介绍,可以自己的操作系统,参考官方的安装指南进行安装。http://www.docker.io

2. 安装GitLab及相关组件

GitLab需要用到数据库来存储相关数据,所以需要在安装GitLab的同时安装数据库,这里使用的是postgresql和redis。我在查找相关的镜像,之后发现有很多现成的镜像,这里我使用的sameersbn镜像。但是有一点我认为不是很好的是:这个镜像没有把redis、postgresql集成到gitlab的容器里面,需要先单独pull这两个镜像run一下,然后再pull gitlab的镜像进行安装。

使用如下命令分别拉取最新的镜像:

docker pull sameersbn/redis
docker pull sameersbn/postgresql
docker pull sameersbn/gitlab

这里有第一个坑:因为我们默认都是从docker的官方仓库中拉去镜像,但是由于国内访问国外的网站有墙,而且速度也是十分的慢,所以需要代理。这里推荐Daocloud加速器 https://www.daocloud.io/ 免费使用,但是需要先注册,登录成功后,找到加速器执行相关命令即可。笔者亲测速度明显快很多!

使用如下命令运行postgresql镜像:

docker run --name postgresql -d   
-e 'DB_NAME=gitlabhq_production'   
-e 'DB_USER=gitlab' 
-e 'DB_PASS=password'   
-e 'DB_EXTENSION=pg_trgm'   
-v /home/root/opt/postgresql/data:/var/lib/postgresql   
sameersbn/postgresql

这里需要解释的是:

(1). 以上是一条命令,反斜杠是为了在命令内换行方便阅读,如果不喜欢,也可以写在一行。
(2). -e后面跟的都是容器的环境参数,都是在制作镜像的时候指定好的,所以不要去改动。
(3). -v后面是添加数据卷,这样在容器退出的时候数据就不会丢失,其中 /home/root/opt/postgresql/data是作者自己创建的文件夹,读者可以自己自定义,后面的部分是容器内的文件路径,需要保持不变。
(4). 命令执行成功之后会在控制台显示一串容器的编号,可以使用命令docker ps查看刚刚启动的容器。

使用如下命令运行redis镜像:

docker run --name redis -d   
-v /home/root/opt/redis/data:/var/lib/redis   
sameersbn/redis

这里跟启动postgresql一样。

使用如下命令运行GitLab镜像:

docker run --name gitlab -d 
--link postgresql:postgresql --link redis:redisio 
-p 10022:22 -p 10080:80 
-e 'GITLAB_PORT=10080' 
-e 'GITLAB_SSH_PORT=10022' 
-e 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string'
-e 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' 
-e 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string'
-e 'GITLAB_HOST=服务器地址' 
-e 'GITLAB_EMAIL=邮箱地址' 
-e 'SMTP_ENABLED=true' 
-e 'SMTP_DOMAIN=www.sina.com' 
-e 'SMTP_HOST=smtp.sina.com'  
-e 'SMTP_STARTTLS=false'  
-e 'SMTP_USER=邮箱地址' 
-e 'SMTP_PASS=邮箱密码' 
-e 'SMTP_AUTHENTICATION=login' 
-e 'GITLAB_BACKUP_SCHEDULE=daily' 
-e 'GITLAB_BACKUP_TIME=10:30' 
-v /home/root/opt/gitlab/data:/home/git/data 
sameersbn/gitlab

这里需要解释的是:

(1). 网上又很多教程讲关于使用docker安装GitLab,但是讲的不全面,至少我按照他们的方法安装时不能正常运行,这里是第三个坑:一定要加上如下环境参数:

-e 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string'
-e 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' 
-e 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string'

有关于这三个环境参数的含义:

未分类

我个人的理解是用来进行加密的key。

(2). 上面有关SMTP的环境参数是配置邮箱的,需要填上对应的邮箱信息,我使用的是新浪邮箱,读者可以根据自己的邮箱进行填写。

(3). 使用GitLab需要两个端口,一个是web端口,一个是SSH端口用于push代码的所以一下代码进行端口映射和指定:

-p 10022:22 -p 10080:80 
-e 'GITLAB_PORT=10080' 
-e 'GITLAB_SSH_PORT=10022' 

(4). GitLab有自带的备份,这里可以通过如下进行配置:

-e 'GITLAB_BACKUP_SCHEDULE=daily' 
-e 'GITLAB_BACKUP_TIME=10:30' 

指定的是每天10:30进行备份。

说到这里基本上GitLab就搭建好了,这里还有一个小坑就是:运行这些容器的时候可以把代码写进shell脚本中,然后通过脚本进行运行,不然直接在终端打的话很麻烦。

一下就是笔者安装完后的截图,直接访问:http://服务器地址:10080 即可,首次访问可能会出现错误页面,刷新几下页面就可以了然后在修改密码默认用户名:root 之后就可以正常使用。

未分类

未分类

未分类

四. 备份

我们可以使用GitLab自带的备份功能,在启动容器的时候就进行设置,然后再使用GitLab的 app:rake gitlab:backup:restore命令进行恢复,这里网上的教程都有说明可以参考以下网站:
sameersbn的GitHub wiki:
https://github.com/sameersbn/docker-gitlab#automated-backups
这个是官方的所以比较全面,里面还有关于各种环境参数的介绍。

这里作者使用的是如下的备份方法:
因为我们在运行postgresql、redis和GitLab的时候都使用了本地的文件夹进行了数据的持久化,而且我们实际需要备份的数据都在本地了,那么其实就可以直接使用rsync命令备份本地的这些卷(刚刚的文件夹)即可,无需再去深入到GitLab内部。如果搭建的GitLab崩溃了,或者服务器崩溃了,直接再使用docker再搭一个,在把刚刚的卷跟对应的postgresql、redis和GitLab内的数据文件夹进行映射即可。这是也不需要修改之前的启动命令,十分的方便而且作者自己测试过,发现能够达到要求,原先的仓库、用户的SSH信息等都在。

在 GitLab CI 中使用 Docker 构建 Go 项目

介绍

这篇文章是我在 CI 环境(特别是在 Gitlab 中)的 Docker 容器中构建 Go 项目的研究总结。我发现很难解决私有依赖问题(来自 Node/.NET 背景),因此这是我写这篇文章的主要原因。如果 Docker 镜像上存在任何问题或提交请求,请随时与我们联系。

dep

由于 dep 是现在管理 Go 依赖关系的最佳选择,因此在构建前之前运行 dep ensure。

注意:我个人不会将我的 vendor/ 文件夹提交到源码控制,如果你这样做,我不确定这个步骤是否可以跳过。

使用 Docker 构建的最好方法是使用 dep ensure -vendor-only。 见这里。

Docker 构建镜像

我第一次尝试使用 golang:1.10,但这个镜像没有:

  • curl
  • git
  • make
  • dep
  • golint

我已经创建好了用于构建的镜像(github / dockerhub),我会保持更新,但我不提供任何担保,因此你应该创建并管理自己的 Dockerhub。

内部依赖关系

我们完全有能力创建一个有公共依赖关系的项目。但是如果你的项目依赖于另一个私人 Gitlab 仓库呢?

在本地运行 dep ensure 应该可以和你的 git 设置一起工作,但是一旦在 CI 上不适用,构建就会失败。

Gitlab 权限模型

这是在 Gitlab 8.12 中添加的,这个我们最关心的有用的功能是在构建期提供的 CI_JOB_TOKEN 环境变量。

这基本上意味着我们可以像这样克隆依赖仓库:

git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/myuser/mydependentrepo

然而,我们希望使这更友好一点,因为 dep 在试图拉取代码时不会奇迹般地添加凭据。

我们将把这一行添加到 .gitlab-ci.yml 的 before_script 部分。

before_script:
  - echo -e "machine gitlab.comnlogin gitlab-ci-tokennpassword ${CI_JOB_TOKEN}" > ~/.netrc

使用 .netrc 文件可以指定哪个凭证用于哪个服务器。这种方法可以避免每次从 Git 中拉取(或推送)时输入用户名和密码。密码以明文形式存储,因此你不应在自己的计算机上执行此操作。这实际用于 Git 在背后使用 cURL。 在这里阅读更多。

项目文件

Makefile

虽然这是可选的,但我发现它使事情变得更容易。

配置这些步骤意味着在 CI 脚本(和本地)中,我们可以运行 make lint、make build 等,而无需每次重复步骤。

GOFILES = $(shell find . -name '*.go' -not -path './vendor/*')
GOPACKAGES = $(shell go list ./...  | grep -v /vendor/)

default: build

workdir:
    mkdir -p workdir

build: workdir/scraper

workdir/scraper: $(GOFILES)
    GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o workdir/scraper .

test: test-all

test-all:
    @go test -v $(GOPACKAGES)

lint: lint-all

lint-all:
    @golint -set_exit_status $(GOPACKAGES)

.gitlab-ci.yml

这是 Gitlab CI 魔术发生的地方。你可能想使用自己的镜像。

image: sjdweb/go-docker-build:1.10

stages:
  - test
  - build

before_script:
  - cd $GOPATH/src
  - mkdir -p gitlab.com/$CI_PROJECT_NAMESPACE
  - cd gitlab.com/$CI_PROJECT_NAMESPACE
  - ln -s $CI_PROJECT_DIR
  - cd $CI_PROJECT_NAME
  - echo -e "machine gitlab.comnlogin gitlab-ci-tokennpassword ${CI_JOB_TOKEN}" > ~/.netrc
  - dep ensure -vendor-only

lint_code:
  stage: test
  script:
    - make lint

unit_tests:
  stage: test
  script:
    - make test

build:
  stage: build
  script:
    - make

缺少了什么

我通常会用我的二进制文件构建 Docker 镜像,并将其推送到 Gitlab 容器注册库中。

你可以看到我正在构建二进制文件并退出,你至少需要将该二进制文件(例如生成文件)存储在某处。

docker部署logstash

logstash

使用ElasticSearch,需要将MySQL内的数据同步到ElasticSearch中去。根据网上文章,觉得logstash属于比较好的同步工具。

不想被logstash环境的搭建与配置困扰。使用docker制作一个镜像,然后可以做到到处运行

Dockerfile

基础镜像:

选择的是dockerhub的logstash。文档地址logstash

镜像文件:

FROM logstash:5

#安装input插件
RUN logstash-plugin install logstash-input-jdbc
#安装output插件
RUN logstash-plugin install logstash-output-elasticsearch
#容器启动时执行的命令.(CMD 能够被 docker run 后面跟的命令行参数替换)
CMD ["-f", "/some/config-dir/logstash-mysql-es.conf"]

build镜像:

docker build -t my-logstash .

条件准备:

创建config目录,创建配置文件logstash-mysql-es.conf
同步MySQL需要MySQL驱动。为了挂载目录的时候,只挂载一个目录。我们把mysql驱动与配置文件放到同一个目录下。

未分类

启动容器:

docker run -d --name logstashmysql -v /root/logstash/config:/some/config-dir/ bc8551a7b495

查看日志:

docker logs -f --tail=30 logstashmysql

CentOS下安装Redis并设置密码外网访问

在windows下,下载redis直接运行redis-server.exe即可,方便快捷。

未分类
redis windows

Centos下安装redis稍微复杂一点。

redis的官网 https://redis.io/

先获取到redis

http://download.redis.io/releases/redis-4.0.9.tar.gz

然后解压编译安装

tar xzf redis-4.0.9.tar.gz
cd redis-4.0.9
make
make install

未分类

编译安装完成后启动Redis

redis-server

也可以通过初始化脚本启动Redis,在编译后的目录utils文件夹中有

redis_init_script

首先将初始化脚本复制到/etc/init.d 目录中,文件名为 redis_端口号(这个mv成了redis_6379),其中端口号表示要让Redis监听的端口号,客户端通过该端口连接Redis。然后修改脚本中的 REDISPORT 变量的值为同样的端口号。

未分类

然后建立存放Redis的配置文件目录和存放Redis持久化的文件目录

/etc/redis 存放Redis的配置文件

/var/redis/端口号 存放Redis的持久化文件(这里是 /var/redis/6379 )

修改配置文件

将配置文件模板 redis-4.0.9/redis.conf 复制到 /etc/redis 目录中,以端口号命名(如 6379.conf ),然后对其中的部分参数进行编辑。

daemonize yes 使Redis以守护进程模式运行
pidfile /var/run/redis_端口号.pid 设置Redis的PID文件位置
port 端口号 设置Redis监听的端口号
dir /var/redis/端口号 设置持久化文件存放位置
#requirepass foobared 若需要设置密码就把注释打开,改成你要设置的密码
bind 127.0.0.1   将其默认的127.0.0.1改为0.0.0.0(代表不做限制),这样外网就能访问了

现在也可以使用下面的命令来启动和关闭Redis了

/etc/init.d/redis_6379 start

/etc/init.d/redis_6379 stop

redis随系统自动启动

chkconfig redis_6379 on

通过上面的操作后,以后也可以直接用下面的命令对Redis进行启动和关闭了,如下

service redis_6379 start

service redis_6379 stop

这样系统重启,Redis也会随着系统启动自动启动起来。

那么怎么停止Redis呢?

上面的stop方法可以停止redis,但是考虑到 Redis 有可能正在将内存中的数据同步到硬盘中,强行终止 Redis 进程可能会导致数据丢失。正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为:

redis-cli SHUTDOWN

当Redis收到SHUTDOWN命令后,会先断开所有客户端连接,然后根据配置执行持久化,最后完成退出。
Redis可以妥善处理 SIGTERM信号,所以使用 kill Redis 进程的 PID也可以正常结束Redis,效果与发送SHUTDOWN命令一样。

如果需要外网访问,首先检查是否被防火墙挡住

然后在配置文件中将bind配置项默认的127.0.0.1改为0.0.0.0

使用腾讯云可能需要在腾讯云控制台对端口进一步设置。

redis刷磁盘可能会导致瞬时无法连接

业务日志监控中报告, 每天会有大约250次连接redis失败.
通过strace追踪发现.故障的时间点时写磁盘时间超过了10s.一般在10-15s之间. redis第二次重试使用的是10s.

这个实例所有的操作都是INCR, fdatasync 会block写.

strace -Ttt -f -p 11302 -T -e  trace=fdatasync

11309 10:21:31.153900 fdatasync(116)    = 0 <0.034295>

11309 10:21:32.078747 fdatasync(116)    = 0 <7.592478>

11309 10:21:39.774959 fdatasync(116)    = 0 <10.098802>

11309 10:21:49.990623 fdatasync(116)    = 0 <2.026147>

11309 10:21:52.129676 fdatasync(116)    = 0 <0.002802>

治标:

超时时间改为15s.

治本:

正在用watchdog抓一下超过5s的堆栈.

堆栈:

[11302 | signal handler] (1499754857)

— WATCHDOG TIMER EXPIRED —

/usr/local/bin/redis-server-2.8 10.160.86.216:6699(logStackTrace+0x3e)[0x445ace]

/lib64/libpthread.so.0(write+0x2d)[0x7f19ef3b06fd]

/lib64/libpthread.so.0(+0xf710)[0x7f19ef3b1710]

/lib64/libpthread.so.0(write+0x2d)[0x7f19ef3b06fd]

/usr/local/bin/redis-server-2.8 10.160.86.216:6699(flushAppendOnlyFile+0x4e)[0x44116e]

/usr/local/bin/redis-server-2.8 10.160.86.216:6699(serverCron+0x3b7)[0x41bb17]

/usr/local/bin/redis-server-2.8 10.160.86.216:6699(aeProcessEvents+0x1e9)[0x416b69]

/usr/local/bin/redis-server-2.8 10.160.86.216:6699(aeMain+0x2b)[0x416deb]

/usr/local/bin/redis-server-2.8 10.160.86.216:6699(main+0x31d)[0x41e49d]

/lib64/libc.so.6(__libc_start_main+0xfd)[0x7f19ef02cd5d]

/usr/local/bin/redis-server-2.8 10.160.86.216:6699[0x415bd9]

[11302 | signal handler] (1499754857) ——–
fdatasync会在某个时间点超过10s.

看来因为写磁盘堵塞了, 把机械硬盘换成了SSD, 解决了。