当前位置: 首页 > 编程日记 > 正文

Redis 集群部署及踩过的坑

本文目标


要在单台机器上搭建Redis集群,方式是通过不同的TCP端口启动多个实例,然后组成集群,同时记录在搭建过程中踩过的坑。


安装准备


centos版本:6.7

redis版本:3.2.3

安装方式:源码安装

服务器:1台


操作步骤


此处默认已安装好单台redis

 

1、启动Redis多个实例


我们在Redis安装目录下创建目录cluster,并编写7000.conf~7005.conf 6个配置文件,这6个配置文件用来启动6个实例,后面将使用这6个实例组成集群。


以7000.conf为例,配置文件需要填写如下几项:


port  7000                                        //端口7000,7001,7002,7003,7004,7005        

bind 192.168.186.91                                     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群

daemonize    yes                               //redis后台运行

pidfile  ./redis_7000.pid          //pidfile文件对应7000,7001,7002,7003,7004,7005

cluster-enabled  yes                           //开启集群  把注释#去掉

cluster-config-file  nodes_7000.conf   //集群的配置  配置文件首次启动自动生成 7000,7001,7002,7003,7004,7005

cluster-node-timeout  15000                //请求超时  默认15秒,可自行设置

appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志


分别启动6个实例


redis-server redis_cluster/7000/redis.conf

redis-server redis_cluster/7001/redis.conf

redis-server redis_cluster/7002/redis.conf

redis-server redis_cluster/7003/redis.conf

redis-server redis_cluster/7004/redis.conf

redis-server redis_cluster/7005/redis.conf


启动成功后,看一下进程


# ps -ef | grep redis | grep cluster

idata    15711 22329  0 18:40 pts/10   00:00:00 ./bin/redis-server 192.168.186.91:7000 [cluster]

idata    15740 22329  0 18:40 pts/10   00:00:00 ./bin/redis-server 192.168.186.91:7001 [cluster]

idata    15810 22329  0 18:40 pts/10   00:00:00 ./bin/redis-server 192.168.186.91:7002 [cluster]

idata    17023 22329  0 18:42 pts/10   00:00:00 ./bin/redis-server 192.168.186.91:7003 [cluster]

idata    17030 22329  0 18:42 pts/10   00:00:00 ./bin/redis-server 192.168.186.91:7004 [cluster]

idata    17035 22329  0 18:42 pts/10   00:00:00 ./bin/redis-server 192.168.186.91:7005 [cluster]


至此,ip=192.168.186.91机器上创建了6个实例,端口号为port=7000~7005。


2、安装ruby


1)yum安装ruby和依赖的包。


[root@itfirst redis_cluster]# yum -y install ruby ruby-devel rubygems rpm-build


2)使用gem这个命令来安装redis接口


[root@itfirst redis_cluster]# gem install redis

ERROR:  Error installing redis:

redis requires Ruby version >= 2.2.2.


这一步骤中出现了bug,度娘告诉我是Ruby版本太低,需要升级版本。


3)升级Ruby的版本


安装rvm,我不知道这是个什么东西,但是感觉像是Ruby的一个包管理器。


[root@itfirst redis_cluster]# curl -L get.rvm.io | bash -s stable

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100 24090  100 24090    0     0  10919      0  0:00:02  0:00:02 --:--:-- 91242

Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz

Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc

gpg 20170911 星期一 045921 CST 创建的签名,使用 RSA,钥匙号 BF04FF17

gpg无法检查签名:No public key

Warning, RVM 1.26.0 introduces signed releases and automated check of signatures when GPG software found.Assuming you trust Michal Papis import the mpapis public key (downloading the signatures).

 

GPG signature verification failed for '/usr/local/rvm/archives/rvm-1.29.3.tgz' -'https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc'Try to install GPG v2 and then fetch the publickey:

 

    gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

 

or if it fails:

 

    command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -

 

the key can be compared with:

 

    https://rvm.io/mpapis.asc

    https://keybase.io/mpapis

 

NOTEGPG version 2.1.17 have a bug which cause failures during fetching keys from remote server. Please downgrade orupgrade to newer version (if available) or use the second method described above.


这一操作得到了:


gpg2 –recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3


然后利用该密钥下载Ruby并升级。


[root@itfirst redis_cluster]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

gpg下载密钥‘D39DC0E3’,从 hkp 服务器 keys.gnupg.net

gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库

gpg密钥 D39DC0E3:公钥“Michal Papis (RVM signing) <mpapis@gmail.com>”已导入

gpg没有找到任何绝对信任的密钥

gpg合计被处理的数量:1

gpg:           已导入:1  (RSA1)

[root@itfirst redis_cluster]# curl -sSL https://get.rvm.io | bash -s stable

Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz

Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc

gpg 20170911 星期一 045921 CST 创建的签名,使用 RSA,钥匙号 BF04FF17

gpg完好的签名,来自于“Michal Papis (RVM signing) <mpapis@gmail.com>

gpg:               亦即“Michal Papis <mpapis@gmail.com>

gpg:               亦即“[jpeg image of size 5015]

gpg警告:这把密钥未经受信任的签名认证!

gpg:       没有证据表明这个签名属于它所声称的持有者。

主钥指纹: 409B 6B17 96C2 7546 2A17  0311 3804 BB82 D39D C0E3

子钥指纹: 62C9 E5F4 DA30 0D94 AC36  166B E206 C29F BF04 FF17

GPG verified '/usr/local/rvm/archives/rvm-1.29.3.tgz'

Creating group 'rvm'

 

Installing RVM to /usr/local/rvm/

Installation of RVM in /usr/local/rvmis almost complete:

 

  * First you need to add all users that will be using rvm to 'rvm' group,

    and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.

 

  * To start using RVM you need to run `source /etc/profile.d/rvm.sh`

    in all your open shell windows, in rare cases you need to reopen all shell windows.


接着,source环境,让rvm可用。


[root@itfirst ~]# source /usr/local/rvm/scripts/rvm


查看Ruby可用版本


[root@itfirst ~]# rvm list known

# MRI Rubies

[ruby-]1.8.6[-p420]

[ruby-]1.8.7[-head] # security released on head

[ruby-]1.9.1[-p431]

[ruby-]1.9.2[-p330]

[ruby-]1.9.3[-p551]

[ruby-]2.0.0[-p648]

[ruby-]2.1[.10]

[ruby-]2.2[.7]

[ruby-]2.3[.4]

[ruby-]2.4[.1]

ruby-head

 

# for forks use: rvm install ruby-head-<name> --url https://github.com/github/ruby.git --branch 2.2

 

# JRuby

jruby-1.6[.8]

jruby-1.7[.27]

jruby[-9.1.13.0]

jruby-head

 

# Rubinius

rbx-1[.4.3]

rbx-2.3[.0]

rbx-2.4[.1]

rbx-2[.5.8]

rbx-3[.84]

rbx-head

 

# Opal

opal

 

# Minimalistic ruby implementation - ISO 30170:2012

mruby-1.0.0

mruby-1.1.0

mruby-1.2.0

mruby-1[.3.0]

mruby[-head]

 

# Ruby Enterprise Edition

ree-1.8.6

ree[-1.8.7][-2012.02]

 

# Topaz

topaz

 

# MagLev

maglev[-head]

maglev-1.0.0

 

# Mac OS X Snow Leopard Or Newer

macruby-0.10

macruby-0.11

macruby[-0.12]

macruby-nightly

macruby-head

 

# IronRuby

ironruby[-1.1.3]

ironruby-head


可以看到最新的版本是2.4.1,本文安装2.3.0


至此,我们升级了Ruby的版本。


[root@itfirst ~]# rvm install 2.3.0

Searching for binary rubies, this might take some time.

Found remote file https://rvm_io.global.ssl.fastly.net/binaries/centos/6/x86_64/ruby-2.3.0.tar.bz2

Checking requirements for centos.

Installing requirements for centos.

Installing required packagesautoconf, automake, bison, libffi-devel, libtool, readline-devel, sqlite-devel, libyaml-devel..........

Requirements installation successful.

ruby-2.3.0 - #configure

ruby-2.3.0 - #download

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100 21.9M  100 21.9M    0     0   266k      0  0:01:24  0:01:24 --:--:--  278k

No checksum for downloaded archive, recording checksum in user configuration.

ruby-2.3.0 - #validate archive

ruby-2.3.0 - #extract

ruby-2.3.0 - #validate binary

ruby-2.3.0 - #setup

ruby-2.3.0 - #gemset created /usr/local/rvm/gems/ruby-2.3.0@global

ruby-2.3.0 - #importing gemset /usr/local/rvm/gemsets/global.gems..............................

ruby-2.3.0 - #generating global wrappers........

ruby-2.3.0 - #gemset created /usr/local/rvm/gems/ruby-2.3.0

ruby-2.3.0 - #importing gemsetfile /usr/local/rvm/gemsets/default.gems evaluated to empty gem list

ruby-2.3.0 - #generating default wrappers........


4)安装gem redis接口


[root@itfirst ~]# rvm use 2.3.0

Using /usr/local/rvm/gems/ruby-2.3.0

[root@itfirst ~]# rvm remove 1.8.7

ruby-1.8.7-head - #already gone

Using /usr/local/rvm/gems/ruby-2.3.0

[root@itfirst ~]#  ruby --version

ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

[root@itfirst ~]# gem install redis

Fetchingredis-4.0.1.gem (100%)

Successfully installed redis-4.0.1

Parsing documentation for redis-4.0.1

Installing ri documentation for redis-4.0.1

Done installing documentation for redis after 0 seconds

1 gem installed


5)安装rubygems


# yum install -y rubygems


到目前为止,我们的Ruby和运行redis-trib.rb需要的环境安装完成了。


3、Redis集群搭建


有了Ruby执行环境,可以开始将之前的6个实例组建成集群了。


redis-trib.rb  create  --replicas  1 192.168.186.91:7000 192.168.186.91:7001 192.168.186.91:7002 192.168.186.91:7003 192.168.186.91:7004 192.168.186.91:7005


有三个master,有三个是slave。 后面跟上6个实例就好了,形式就是ip:port


【此处有坑】


第一坑


[root@itfirst src]# redis-trib.rb  create  --replicas  1 192.168.186.91:7000 192.168.186.91:7001 192.168.186.91:7002 192.168.186.91:7003 192.168.186.91:7004 192.168.186.91:7005

-bashredis-trib.rbcommand not found

[root@itfirst src]# cp redis-trib.rb /usr/local/bin


需要将redis-trib.rb复制到/usr/local/bin目录下。


第二坑


[root@itfirst bin]# redis-trib.rb  create  --replicas  1 192.168.186.91:7000 192.168.186.91:7001 192.168.186.91:7002 192.168.186.91:7003 192.168.186.91:7004 192.168.186.91:7005

>>> Creating cluster

[ERR] Node 192.168.186.91:7000 is not empty. Either the node already knows other nodes (check with CLUSTERNODES) or contains some key in database 0.


踩完第一坑后,继续执行,发现了第二坑,还好有度娘,但是网上各种说法都有(主要参照了《极客on之路》的博客),发现错误的原因是redis数据库没有清除。


[root@itfirst src]# redis-cli -h 192.168.186.91 -p 7001

192.168.186.91:7001flushdb

OK

192.168.186.91:7001quit

[root@itfirst src]# redis-cli -h 192.168.186.91 -p 7002

192.168.186.91:7002flushdb

OK

192.168.186.91:7002quit

[root@itfirst src]# redis-cli -h 192.168.186.91 -p 7003

192.168.186.91:7003flushdb

OK

192.168.186.91:7003quit

[root@itfirst src]# redis-cli -h 192.168.186.91 -p 7004

192.168.186.91:7004flushdb

OK

192.168.186.91:7004quit

[root@itfirst src]# redis-cli -h 192.168.186.91 -p 7005

192.168.186.91:7005flushdb

OK

192.168.186.91:7005quit

[root@itfirst src]# redis-trib.rb  create  --replicas  1 192.168.186.91:7000 192.168.186.91:7001 192.168.186.91:7002 192.168.186.91:7003 192.168.186.91:7004 192.168.186.91:7005

>>> Creating cluster

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.186.91:7000

192.168.186.91:7001

192.168.186.91:7002

Adding replica 192.168.186.91:7003 to 192.168.186.91:7000

Adding replica 192.168.186.91:7004 to 192.168.186.91:7001

Adding replica 192.168.186.91:7005 to 192.168.186.91:7002

M61b2b608177374fd0382c872f996a2c25f62daac 192.168.186.91:7000

   slots:0-5460,9189 (5462 slots) master

M50e678c98c31baa4ece1cba096cc34b4545456f3 192.168.186.91:7001

   slots:5461-10922 (5462 slots) master

Mb8dc855a92d1c9a6e358380286a757011c40601d 192.168.186.91:7002

   slots:9189,10923-16383 (5462 slots) master

S42392d8b4665500b3229b5c5b9dcebed311c9cdf 192.168.186.91:7003

   replicates 61b2b608177374fd0382c872f996a2c25f62daac

S4e8cd9bae1dc0ffa63a3b8315e3f92b0490e65f8 192.168.186.91:7004

   replicates 50e678c98c31baa4ece1cba096cc34b4545456f3

S3344981c3290c39b0d9f427842398c17de835293 192.168.186.91:7005

   replicates b8dc855a92d1c9a6e358380286a757011c40601d

Can I set the above configuration? (type 'yes' to accept)yes

/usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 9189 is already busy (Redis::CommandError)

from /usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis.rb:2764:in `block in method_missing'

from /usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis.rb:45:in `block in synchronize'

from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'

from /usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis.rb:45:in `synchronize'

from /usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis.rb:2763:in `method_missing'

from /usr/local/bin/redis-trib.rb:212:in `flush_node_config'

from /usr/local/bin/redis-trib.rb:776:in `block in flush_nodes_config'

from /usr/local/bin/redis-trib.rb:775:in `each'

from /usr/local/bin/redis-trib.rb:775:in `flush_nodes_config'

from /usr/local/bin/redis-trib.rb:1296:in `create_cluster_cmd'

from /usr/local/bin/redis-trib.rb:1696:in `<main>'


第三坑


[root@itfirst src]# redis-trib.rb  create  --replicas  1 192.168.186.91:7000 192.168.186.91:7001 192.168.186.91:7002 192.168.186.91:7003 192.168.186.91:7004 192.168.186.91:7005

>>> Creating cluster

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.186.91:7000

192.168.186.91:7001

192.168.186.91:7002

Adding replica 192.168.186.91:7003 to 192.168.186.91:7000

Adding replica 192.168.186.91:7004 to 192.168.186.91:7001

Adding replica 192.168.186.91:7005 to 192.168.186.91:7002

M61b2b608177374fd0382c872f996a2c25f62daac 192.168.186.91:7000

   slots:0-5460,9189 (5462 slots) master

M50e678c98c31baa4ece1cba096cc34b4545456f3 192.168.186.91:7001

   slots:5461-10922 (5462 slots) master

Mb8dc855a92d1c9a6e358380286a757011c40601d 192.168.186.91:7002

   slots:9189,10923-16383 (5462 slots) master

S42392d8b4665500b3229b5c5b9dcebed311c9cdf 192.168.186.91:7003

   replicates 61b2b608177374fd0382c872f996a2c25f62daac

S4e8cd9bae1dc0ffa63a3b8315e3f92b0490e65f8 192.168.186.91:7004

   replicates 50e678c98c31baa4ece1cba096cc34b4545456f3

S3344981c3290c39b0d9f427842398c17de835293 192.168.186.91:7005

   replicates b8dc855a92d1c9a6e358380286a757011c40601d

Can I set the above configuration? (type 'yes' to accept)yes

/usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 9189 is already busy (Redis::CommandError)

from /usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis.rb:2764:in `block in method_missing'

from /usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis.rb:45:in `block in synchronize'

from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'

from /usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis.rb:45:in `synchronize'

from /usr/local/rvm/gems/ruby-2.3.0/gems/redis-4.0.1/lib/redis.rb:2763:in `method_missing'

from /usr/local/bin/redis-trib.rb:212:in `flush_node_config'

from /usr/local/bin/redis-trib.rb:776:in `block in flush_nodes_config'

from /usr/local/bin/redis-trib.rb:775:in `each'

from /usr/local/bin/redis-trib.rb:775:in `flush_nodes_config'

from /usr/local/bin/redis-trib.rb:1296:in `create_cluster_cmd'

from /usr/local/bin/redis-trib.rb:1696:in `<main>'


还是度娘靠谱,在《redis 跨机器集群启动出错》博客中找到了答案。


这是由于之间创建集群没有成功,需要将nodes.conf和dir里面的文件全部删除。


[root@itfirst 7000]# find / -name "nodes-7000.conf"

/usr/local/redis-3.2.3/src/nodes-7000.conf

[root@itfirst 7000]# cd ../../

[root@itfirst src]# rm -rf nodes-700*


然后重启redis服务。


[root@itfirst src]# redis-trib.rb  create  --replicas  1 192.168.186.91:7000 192.168.186.91:7001 192.168.186.91:7002 192.168.186.91:7003 192.168.186.91:7004 192.168.186.91:7005

>>> Creating cluster

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.186.91:7000

192.168.186.91:7001

192.168.186.91:7002

Adding replica 192.168.186.91:7003 to 192.168.186.91:7000

Adding replica 192.168.186.91:7004 to 192.168.186.91:7001

Adding replica 192.168.186.91:7005 to 192.168.186.91:7002

M319da27d8668a15d2d2d02afe433247694343459 192.168.186.91:7000

   slots:0-5460 (5461 slots) master

M3da756265e301ac0210760f13e990473f87a3017 192.168.186.91:7001

   slots:5461-10922 (5462 slots) master

M6f336da48c892d8e0c541a864765978ebfbca6d5 192.168.186.91:7002

   slots:10923-16383 (5461 slots) master

Sff4cf9d8a141d85c478b9af0358c93bca342c236 192.168.186.91:7003

   replicates 319da27d8668a15d2d2d02afe433247694343459

S43c2e0d7799e84b449803a68d557c3431e9e047e 192.168.186.91:7004

   replicates 3da756265e301ac0210760f13e990473f87a3017

S3f174fae106cb6cf7e7f21ed844895ed7c18f793 192.168.186.91:7005

   replicates 6f336da48c892d8e0c541a864765978ebfbca6d5

Can I set the above configuration? (type 'yes' to accept)yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join....

>>> Performing Cluster Check (using node 192.168.186.91:7000)

M319da27d8668a15d2d2d02afe433247694343459 192.168.186.91:7000

   slots:0-5460 (5461 slots) master

M3da756265e301ac0210760f13e990473f87a3017 192.168.186.91:7001

   slots:5461-10922 (5462 slots) master

M6f336da48c892d8e0c541a864765978ebfbca6d5 192.168.186.91:7002

   slots:10923-16383 (5461 slots) master

Mff4cf9d8a141d85c478b9af0358c93bca342c236 192.168.186.91:7003

   slots(0 slots) master

   replicates 319da27d8668a15d2d2d02afe433247694343459

M43c2e0d7799e84b449803a68d557c3431e9e047e 192.168.186.91:7004

   slots(0 slots) master

   replicates 3da756265e301ac0210760f13e990473f87a3017

M3f174fae106cb6cf7e7f21ed844895ed7c18f793 192.168.186.91:7005

   slots(0 slots) master

   replicates 6f336da48c892d8e0c541a864765978ebfbca6d5

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.


4、验证集群状态


登录集群客户端,-c标识以集群方式登录


[root@itfirst src]# redis-cli -h 192.168.186.91 -c -p 7002


查看集群状态


192.168.186.91:7002cluster info

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:6

cluster_size:3

cluster_current_epoch:6

cluster_my_epoch:3

cluster_stats_messages_sent:124174

cluster_stats_messages_received:124174

192.168.186.91:7002cluster nodes

319da27d8668a15d2d2d02afe433247694343459 192.168.186.91:7000 master - 0 1519465974307 1 connected 0-5460

3f174fae106cb6cf7e7f21ed844895ed7c18f793 192.168.186.91:7005 slave6f336da48c892d8e0c541a864765978ebfbca6d5 0 1519465971278 6 connected

6f336da48c892d8e0c541a864765978ebfbca6d5 192.168.186.91:7002 myself,master - 0 0 3 connected 10923-16383

3da756265e301ac0210760f13e990473f87a3017 192.168.186.91:7001 master - 0 1519465972288 2 connected 5461-10922

43c2e0d7799e84b449803a68d557c3431e9e047e 192.168.186.91:7004 slave3da756265e301ac0210760f13e990473f87a3017 0 1519465973298 5 connected

ff4cf9d8a141d85c478b9af0358c93bca342c236 192.168.186.91:7003 slave319da27d8668a15d2d2d02afe433247694343459 0 1519465969258 4 connected

www.codexueyuan.com

相关文章:

【linux】Valgrind工具集详解(三):打印信息说明

一、打印信息格式 Valgrind打印信息的格式如下,很容易和程序输出信息区分出来 == 进程ID ==Valgrind的打印信息二、打印到何处 1、打印到文件描述符中 主要是设置打印到终端上,默认情况下为2(stderr标准错误输出)。如果要想打印到其他文件描述符(例如编号9),则可以指…

杨超越第一,Python第二

追星追到程序员们狂热得搞起了编程比赛&#xff0c;长这么大&#xff0c;这种应援架势真没见过。没错&#xff0c;说的就是你们的杨超越妹妹。近日百度贴吧吧主在杨超越吧发帖&#xff0c;呼吁要为自己的偶像组织第一届杨超越杯编程大赛&#xff0c;众粉丝呼应&#xff0c;随即…

SQL Server数据库错误9003(LSN无效)的处理方法

国内一些ERP、财务软件一般后台都使用SQL Server的数据库&#xff0c;SQL Server作为一个中大型数据库是不应该在桌面系统上运行的&#xff0c;小规模企业一般不使用专用服务器&#xff0c;大部分直接使用XP系统桌面引擎MSDE作为SQL数据库的后台服务。这种方案当然就谈不上什么…

新款Tesla最低仅售26.2万,马斯克终于凑齐了S3XY

作者 | 琥珀出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09;北京时间 3 月 15 日上午许&#xff0c;整整等待了 20 分钟的特斯拉 Model Y 新品发布会终于开场。在台下观众的阵阵欢呼声中&#xff0c;台上的埃隆 马斯克显得神采奕奕。这次&#xff…

【linux】Valgrind工具集详解(四):抑制错误

一、什么是抑制错误 错误检查工具可以检测系统库中的许多问题,例如C库,它是随操作系统预安装的。这些错误无法修复,并且有很多,但不希望看到这些错误。如何屏蔽这样错误就叫做“抑制错误”。 二、使用方法 1、使用默认的抑制错误配置 valgrind参数为 –default-suppress…

jenkins配置git

# jenkins配置git # 检测当前git版本是否是2.7.4以上 git --version # 如果没有安装git直接源码安装即可&#xff0c;如果安装了先删除原来的git yum -y remove git # 先安装编译git需要的包 yum -y install zlib-devel perl-CPAN gettext curl-devel expat-devel gettext-deve…

让别人不知道你的网站使用PHP

2019独角兽企业重金招聘Python工程师标准>>> 如果不想让别人知道你的网站使用了PHP程序&#xff0c;这样可以提高网站的安全。这并不说明PHP不安全&#xff0c;只是可以防止一些人攻击你的网站。你可以按照下面的方法设置你的httpd.conf文件。 你可以使用下面的方法…

【linux】Valgrind工具集详解(五):命令行详解

一、使用方法 usage: valgrind [options] prog-and-args 使用方法:valgrind [参数选项] 程序和参数 二、选择工具 tool-selection option, with default in [ ]: 工具选择选项,默认值在[]中: –tool= use the Valgrind tool named [memcheck] name取值如下: 1、memcheck…

小白程序员仅用5分钟入职BAT,他只做了这件事!

有一个知名独立博客「左岸读书」&#xff0c;坚持运营11年。最为印象深刻的&#xff0c;是网站的副标题&#xff1a;一切成就&#xff0c;均源自积累。我曾经“唯天赋主义”&#xff0c;觉得有些事永远都学不好。但慢慢的我发现&#xff0c;疏于锻炼、但依然是NBA第一中锋的奥尼…

源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

该文章阅读的AFNetworking的版本为3.2.0。 这个分类提供了对请求周期进行控制的方法&#xff0c;包括进度监控、成功和失败的回调。 1.接口文件 1.1.属性 /**网络会话管理者对象*/ property (nonatomic, strong) AFHTTPSessionManager *sessionManager; 复制代码1.2.方法 /**异…

腾讯微博快速有效增加广播转播量的方法与技巧

经过一段时间对腾讯微博的实践&#xff0c;对腾讯微博也算是有所收获&#xff0c;要做好腾讯微博&#xff0c;无非就是两个方面&#xff0c;一是增加听众数&#xff0c;二是增加广播的转播量&#xff0c;本篇写的是做好微博质量–即增加转播量的方法。增加转播量不像增加听众数…

详解 | 推荐系统的工程实现

作者 | gongyouliu 来源 | 大数据工程师01 写在前面本篇文章作者会结合多年推荐系统开发的实践经验粗略介绍推荐系统的工程实现&#xff0c;简要说明要将推荐系统很好地落地到产品中需要考虑哪些问题及相应的思路、策略和建议,其中有大量关于设计哲学的思考,希望对从事推荐算法…

【linux】Valgrind工具集详解(六):使用Valgrind gdbserver和GDB调试程序

一、概述 在Valgrind下运行的程序不是由CPU直接执行的。相反,它运行在Valgrind提供的合成CPU上。这就是调试器在Valgrind上运行时无法调试程序的原因。 二、快速入门 在使用Memcheck工具时使用GDB调试程序,启动方式如下: 1、valgrind --vgdb = yes --vgdb-error = 0 可执…

C++模式学习------工厂模式

工厂模式属于创建型模式&#xff0c;大致可以分为简单工厂模式、抽象工厂模式。 简单工厂模式&#xff0c;它的主要特点是需要在工厂类中做判断&#xff0c;从而创造相应的产品。 1 enum PTYPE2 {3 ProdA 0,4 ProdB 15 };6 7 class ProductBase8 {9 public: 10 v…

JavaScript中正则表达式学习(一)

2019独角兽企业重金招聘Python工程师标准>>> 1.判断是不是手机号码&#xff08;实际判断是不是11位数字&#xff0c;可以用\d来匹配数字&#xff09; 表单部分代码&#xff1a; <form name"form1" > <lable>请输入&#xff1a;</lable>…

深度 | 推荐系统评估

作者 | gongyouliu 来源 | 大数据工程师作者在上篇文章《推荐系统的工程实现》中提到推荐系统要很好地落地到业务中&#xff0c;需要搭建支撑模块&#xff0c;其中效果评估模块就是其中非常重要的一个。本篇文章作者来详细说明怎么评估(Evaluating)推荐系统的效果&#xff0c;…

【linux】Valgrind工具集详解(七):Memcheck(内存错误检测器)

一、概述 Memcheck是一个内存错误检测器。它可以检测C和C ++程序中常见的以下问题: 1、非法内存:如越界、释放后继续访问; 2、使用未初始化的值; 3、释放内存错误:如double-free(同一内存上执行了两次free)、或者 malloc、new、new[] 与 free、delete、delete[]错配使用…

Kafka系列三 java API操作

使用java API操作kafka 1.pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.x…

用自己的×××身换来男朋友的健康

MASKDIY BLOG开通作 他把她当成孩子一样宠着&#xff0c;不让她工作&#xff0c;更不让她做一点点家务。他对她说&#xff1a;我就是要让你幸福&#xff0c;一点苦也不让你尝&#xff0c;等你快乐的长到二十岁&#xff0c;我就娶你&#xff0c;继续宠你养你一辈子。   他是一…

R和Python谁更好?这次让你「鱼与熊掌」兼得

作者 | Parul Pandey译者 | 大鱼责编 | Jane出品 | Python大本营&#xff08;公众号id&#xff1a;pythonnews&#xff09;如果你从事在数据科学领域&#xff0c;提到编程语言&#xff0c;一定能马上想到 R 语言和 Python语言&#xff08;以下分别简称 R、Python&#xff09;。…

大学实习就要来了,买个性价比高的笔记本应付一下

人才市场历来有着“金三银四”、“金九银十”招聘高峰期之说。“金九银十”指的是每年9、10月份&#xff0c;各大企业为第二年拓宽事务许多吸纳人才&#xff0c;一起应届高校毕业生找作业&#xff0c;供需两旺。而“金三银四”则是职场人拿到了奖金&#xff0c;看清了得失&…

【linux】Valgrind工具集详解(八):Memcheck命令行参数详解

【linux】Valgrind工具集详解(五):命令行详解中不够全,在此专门针对Memcheck工具中的命令行参数做一次详细的解释。 Memcheck命令行选项 –leak-check=<no|summary|yes|full> [default: summary] 程序执行完毕后,搜索内存泄漏。默认值为summary,只统计发生了多少…

PHP 5.3 中不建议使用的(部分)函数列表

2019独角兽企业重金招聘Python工程师标准>>> PHP 5.3.0 introduces two new error levels: E_DEPRECATED and E_USER_DEPRECATED. The E_DEPRECATED error level is used to indicate that a function or feature has been deprecated. The E_USER_DEPRECATED level…

【linux】Valgrind工具集详解(九):Memcheck检查的内容和方法

一、值的有效性 1、什么是值的有效性? 英文原文是Valid-value (V) bits,直译过来就是有效值(V)位。 我将它理解为值的有效性,就是判断在内存或CPU的物理地址中存储的数据是否有效,比如在内存中变量(int i)代表的物理位置(不是地址),没有初始化,就去使用它,是否合…

微软亚研院提出用于语义分割的结构化知识蒸馏 | CVPR 2019

作者 | CV君来源 | 我爱计算机视觉今天跟大家分享一篇关于语义分割的论文&#xff0c;刚刚上传到arXiv的CVPR 2019接收论文《Structured Knowledge Distillation for Semantic Segmentation》&#xff0c;通讯作者单位为微软亚洲研究院。作者信息&#xff1a;作者分别来自澳大利…

Elam的git笔记:(二)git的安装与基本操作介绍

Giti安装 下载地址下载&#xff1a;https://git-scm.com/download/win自动下载64位&#xff0c;如果是32位系统&#xff0c;取消下载后自行下载对应版本双击安装&#xff0c;自选项可根据自身需求自由选择 习惯于cmd的同学可以选择第二个安装完成后在桌面右键&#xff0c;选择G…

创新驱动未来,浪潮持续深耕信息安全市场

2010年&#xff0c;我国信息安全行业在快速发展中涌现出众多优秀的安全厂商&#xff0c;以创新的产品及技术推动中国信息安全产业做大做强。其中&#xff0c;浪潮创造性地开发出了英信安全服务器&#xff0c;加上此前推出的浪潮服务器安全加固系统&#xff08;&#xff09;&…

Pig变飞机?AI为什么这么蠢 | Adversarial Attack

整理 | Jane责编 | Jane出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09;【编者按】这篇文章的起意有两点&#xff1a;一是由刚刚过去的 315 打假日&#xff0c;智能语音机器人在过去一年拨出的超 40 亿电话&#xff0c;联想到前一段时间引起大家热烈…

【linux】Valgrind工具集详解(十):SGCheck(检查栈和全局数组溢出)

一、概述 SGCheck是一种用于检查栈中和全局数组溢出的工具。它的工作原理是使用一种启发式方法,该方法源于对可能的堆栈形式和全局数组访问的观察。 栈中的数据:例如函数内声明数组int a[10],而不是malloc分配的,malloc分配的内存是在堆中。 SGCheck和Memcheck是互补的:它…

shell脚本之 if,case,for的用法

目录一.条件选择&#xff1a;if语句二.条件判断&#xff1a;case语句三.for循环 一.条件选择&#xff1a;if语句 单分支if 判断条件;then 条件为真的分支代码fi 例子&#xff1a;判断一个数字是否等于10 #!/bin/bashread -p 输入一个数字 numif [ $num -eq 10 ];thenecho 该数字…