首页 文章 精选 留言 我的

精选列表

搜索[密码管理],共10000篇文章
优秀的个人博客,低调大师

数据源管理 | 分布式NoSQL系统,Cassandra集群管理

本文源码:GitHub·点这里 || GitEE·点这里 一、Cassandra简介 1、基础描述 Cassandra是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,此后,由于Cassandra良好的可扩展性,逐渐发展成为了一种流行的分布式结构化数据存储方案。 2、特点分析 弹性可扩展性 Cassandra是高度可扩展的;它允许添加更多的硬件以适应更多的客户和更多的数据根据要求,可以根据业务的数据流量轻松扩展集群规模。 架构特点 Cassandra可以基于分布式运行,并采用了许多容错机制。由于去中心化无主的策略,所以没有单点故障。可以做到不停服滚动升级。这是因为Cassandra可以支持多个节点的临时失效(取决于群集大小),对群集的整体性能影响可以忽略不计。并且Cassandra提供多地域容灾。Cassandra允许将数据复制到其他数据中心,并在多个地域保留多副本,十分适用于不能承担故障的关键业务,必须持续提供服务的应用程序。 数据存储机制 Cassandra适应所有可能的数据格式,包括:结构化,半结构化和非结构化。可以根据业务的需要动态地适应变化的数据结构,并且通过在多个数据中心之间复制数据,可以灵活地在需要时分发数据。有许多案例证明Cassandra可以在金融,医疗,物联网等领域使用。 资源整合能力 Cassandra可以很容易的跟其他开源组件做集成,其中包括Hadoop,Spark,Kafka,Solr等系列组件,成为大数据业务处理里面重要的一个角色。 二、集群环境搭建 1、环境概览 jdk1.8 apache-cassandra-3.11.7-bin.tar.gz centos7 三台服务:hop01、hop02、hop03节点 2、安装包处理 tar -zxvf apache-cassandra-3.11.7-bin.tar.gz mv apache-cassandra-3.11.7 cassandra3.11 3、环境变量 [root@hop01 opt]# vim /etc/profile export CASSANDRA_HOME=/opt/cassandra3.11 export PATH=$PATH:$CASSANDRA_HOME/bin [root@hop01 opt]# source /etc/profile 4、创建目录 # 数据目录 mkdir -p /data/cassandra/data # 日志目录 mkdir -p /data/cassandra/log 5、集群配置 vim /opt/cassandra3.11/conf/cassandra.yaml # 配置集群名称 cluster_name: 'CasCluster' # 配置数据目录 data_file_directories: - /data/cassandra/data # 配置日志目录 commitlog_directory: /data/cassandra/log # 设置监听地址,当前服务IP listen_address: 192.168.72.132 # 配置RPC服务 start_rpc: true rpc_address: 192.168.72.132 # 配置集群节点 seed_provider: - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: - seeds: "192.168.72.132,192.168.72.138,192.168.72.139" 将该配置分发到集群的每个节点,注意listen_address和rpc_address是节点自己的IP地址即可。 6、启动集群 # 集群下节点依次执行启动命令 cassandra -R # 查看节点状态 nodetool status 7、基础操作 进入命令行 cqlsh hop01 创建keyspace,并选择 CREATE KEYSPACE IF NOT EXISTS castest WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':3}; use castest ; 创建表,写入数据 CREATE TABLE user_info (id int, user_name varchar, PRIMARY KEY (id) ); INSERT INTO user_info (id,user_name) VALUES (1,'user01'); 查询数据 select * from user_info ; 基于其他服务查看数据,可以看到数据已经在集群间做了同步过程: 三、集成SpringBoot框架 1、核心依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-cassandra</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>${spring.boot.version}</version> </dependency> 这里核心需要cassandra依赖和操作的API依赖。 2、核心配置 spring: data: cassandra: keyspace-name: castest contact-points: 192.168.72.138,192.168.72.132,192.168.72.139 port: 9042 cluster-name: CasCluster keyspace-name:类似关系型数据库的名称; contact-points:集群下节点的IP地址; port:默认端口; cluster-name:上述配置的集群名称; 3、基于Template命令 CassandraTemplate模板类,实现了一系列操作Cassandra数据库的基本方法,直接注入即可使用。 @Repository public class UserInfoTemplate { @Resource private CassandraTemplate cassandraTemplate ; // 查询全部数据 public List<UserInfo> getList (){ return cassandraTemplate.select("SELECT * FROM user_info",UserInfo.class) ; } // 添加数据 public UserInfo insert (UserInfo userInfo){ return cassandraTemplate.insert(userInfo) ; } // 根据主键查询 public UserInfo selectOneById (Integer id){ return cassandraTemplate.selectOneById(id,UserInfo.class) ; } // 修改数据 public UserInfo update (UserInfo userInfo){ return cassandraTemplate.update(userInfo) ; } // 删除数据 public Boolean deleteById (Integer id){ return cassandraTemplate.deleteById(id,UserInfo.class) ; } } 4、基于Repository接口 SpringBoot框架中定义的数据库访问核心接口。 接口实现 import com.cassand.cluster.entity.UserInfo; import org.springframework.data.repository.CrudRepository; public interface UserInfoRepository extends CrudRepository<UserInfo,Integer> { } 接口用法 @Service public class RepositoryService { @Resource private UserInfoRepository userInfoRepository ; // 保存 public UserInfo save (UserInfo userInfo){ return userInfoRepository.save(userInfo) ; } // 查询 public UserInfo getById (Integer id){ return userInfoRepository.findById(id).get() ; } // 修改 public UserInfo update (UserInfo userInfo){ // 主键ID存在的情况即为修改 return userInfoRepository.save(userInfo); } // 删除 public void deleteById (Integer id){ userInfoRepository.deleteById(id); } } 5、实体表结构 注意这里的注解是基于cassandra特定的一套。 import org.springframework.data.cassandra.core.mapping.Column; import org.springframework.data.cassandra.core.mapping.PrimaryKey; import org.springframework.data.cassandra.core.mapping.Table; @Table("user_info") public class UserInfo { public UserInfo(Integer id, String userName) { this.id = id; this.userName = userName; } @PrimaryKey private Integer id ; @Column(value = "user_name") private String userName ; } 四、源代码地址 GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent

优秀的个人博客,低调大师

openstack 命令行管理二十 - instance novnc 访问管理 (备忘)

查询实例访问方法 [root@station140 nova(keystone_admin)]# nova get-vnc-console terry_instance1 novnc +-------+-------------------------------------------------------------------------------------+ | Type | Url | +-------+-------------------------------------------------------------------------------------+ | novnc | http://192.168.48.140:6080/vnc_auto.html?token=ee1931a2-35ed-4e04-901b-47bf60e7576d | +-------+-------------------------------------------------------------------------------------+ 上述 URL 可通过 chrome 进行访问, IE 估计有问题

优秀的个人博客,低调大师

openstack 命令行管理九 - flavor管理[主机模板] (备忘)

 帮助 [root@station140 tmp(keystone_admin)]# nova help | grep flavor flavor-access-add Add flavor access for the given tenant. flavor-access-list Print access information about the given flavor. flavor-access-remove Remove flavor access for the given tenant. flavor-create Create a new flavor flavor-delete Delete a specific flavor flavor-key Set or unset extra_spec for a flavor. flavor-list Print a list of available 'flavors' (sizes of flavor-show Show details about the given flavor. volume-type-delete Delete a specific flavor 创建自定义 flavor [root@station140 tmp(keystone_admin)]# nova flavor-create m1.vcomputer 6 2048 20 1 +----+--------------+-----------+------+-----------+------+-------+-------------+-----------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | +----+--------------+-----------+------+-----------+------+-------+-------------+-----------+ | 6 | m1.vcomputer | 2048 | 20 | 0 | | 1 | 1.0 | True | +----+--------------+-----------+------+-----------+------+-------+-------------+-----------+ 列出 [root@station140 tmp(keystone_admin)]# nova flavor-list +----+--------------+-----------+------+-----------+------+-------+-------------+-----------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | +----+--------------+-----------+------+-----------+------+-------+-------------+-----------+ | 1 | m1.tiny | 512 | 1 | 0 | | 1 | 1.0 | True | | 2 | m1.small | 2048 | 20 | 0 | | 1 | 1.0 | True | | 3 | m1.medium | 4096 | 40 | 0 | | 2 | 1.0 | True | | 4 | m1.large | 8192 | 80 | 0 | | 4 | 1.0 | True | | 5 | m1.xlarge | 16384 | 160 | 0 | | 8 | 1.0 | True | | 6 | m1.vcomputer | 2048 | 10 | 0 | | 1 | 1.0 | True | +----+--------------+-----------+------+-----------+------+-------+-------------+-----------+ 查询一下 tenant ID [root@station140 ~(keystone_admin)]# keystone tenant-list +----------------------------------+----------+---------+ | id | name | enabled | +----------------------------------+----------+---------+ | 9467f30b8bba4770a06a687e4584636b | cloud | True | +----------------------------------+----------+---------+ 创建后需要分配到对应的 project [root@station140 tmp(keystone_admin)]# nova flavor-access-add 6 9467f30b8bba4770a06a687e4584636b +-----------+----------------------------------+ | Flavor_ID | Tenant_ID | +-----------+----------------------------------+ | 6 | 9467f30b8bba4770a06a687e4584636b | +-----------+----------------------------------+ 注意下面错误信息 [root@station140 tmp(keystone_admin)]# nova flavor-access-list --flavor 6 <- 不针对 public 哟 ERROR: Failed to get access list for public flavor type.

优秀的个人博客,低调大师

别再问WiFi密码了,HMS Core统一扫码服务让手机一键联网

现代生活离不开网络,在餐厅、商场等公共场所,手机连接WiFi一直是高频使用场景。虽然公共场所的免费WiFi越来越多,但网络连接过程却很麻烦。有的需要打开网页注册或点击广告链接才能上网,还有的要求下载特定App才能连接。 那么有没有什么更方便的联网方式呢?“扫码联网”提出了解决方案,商家可以在店放置包含WiFi信息的二维码。用户打开手机相机扫码即可连接WiFi,还支持将二维码分享给身边好友,使入网更快、更直观,并且无需担心隐私泄露、被推送无用信息等问题。 效果展示 实现原理 通过HMS Core统一扫码服务的码生成和扫码能力,轻松实现扫码连WiFi这一场景。 开发实战 一、构建扫码功能 开发准备 1.1 配置华为Maven仓地址 在项目中“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。在“allprojects > repositories”中配置HMS Core SDK的Maven仓地址。 buildscript { repositories { google() jcenter() // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} } } allprojects { repositories { google() jcenter() // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} } } Gradle 7.0版本后,“allprojects > repositories”配置已迁移到项目级“settings.gradle”文件中。“settings.gradle”文件配置示例如下: dependencyResolutionManagement { ... repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} } } 1.2 添加编译依赖 位置应用build.gradle dependencies{ //Scan SDK implementation 'com.huawei.hms:scan:2.3.0.300' } 1.3 代码混淆 在应用级根目录下打开混淆配置文件“proguard-rules.pro”,加入排除HMS Core SDK的混淆配置脚本。 -ignorewarnings -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.huawei.hianalytics.**{*;} -keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.hms.**{*;} 1.4 Manifest.xml添加权限 <!--相机权限--> <uses-permission android:name="android.permission.CAMERA" /> <!--文件读取权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 1.5 申请动态权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, requestCode); 1.6 申请权限结果 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (permissions == null || grantResults == null) { return; } // 申请权限成功或已有权限 if (requestCode == CAMERA_REQ_CODE) { // Default View Mode方式扫码接口 // 参数说明: // activity 请求扫码的activity // requestCode 扫码请求的请求码,用于鉴定activity返回时是否从扫码界面返回。 // option 扫码格式选项,可以置为“null” ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, new HmsScanAnalyzerOptions.Creator().create()); } } 1.7 回调接口接收扫码结果,相机扫码和导入图片扫码均通过该接口返回。 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK || data == null) { return; } if (requestCode == REQUEST_CODE_SCAN_ONE) { // 导入图片扫描返回结果 HmsScan hmsScan = data.getParcelableExtra(ScanUtil.RESULT); if (hmsScan != null) { // 码值结果 rawResult自定义TextView rawResult.setText(hmsScan.getOriginalValue()); } } } 二、构建码生成功能 构建扫码功能同样需要配置Marven仓地址,添加编译依赖和配置混淆脚本,参考上方1.1,1.2和1.3 2.1 Manifest.xml添加权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 2.2 申请动态权限 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},requestCode); 2.3 申请权限结果 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (permissions == null || grantResults == null) { return; } if (grantResults[0] == PackageManager.PERMISSION_GRANTED && requestCode == GENERATE_CODE) { Intent intent = new Intent(this, GenerateCodeActivity.class); this.startActivity(intent); } } 2.4 生成二维码 public void generateCodeBtnClick(View v) { try { HmsBuildBitmapOption options = new HmsBuildBitmapOption.Creator() .setBitmapMargin(margin) .setBitmapColor(color) .setBitmapBackgroundColor(background) .create(); resultImage = ScanUtil.buildBitmap(content, type, width, height, options); barcodeImage.setImageBitmap(resultImage); } catch (WriterException e) { Toast.makeText(this, "Parameter Error!", Toast.LENGTH_SHORT).show(); } } 2.5 保存二维码 public void saveCodeBtnClick(View v) { if (resultImage == null) { Toast.makeText(GenerateCodeActivity.this, "Please generate barcode first!", Toast.LENGTH_LONG).show(); return; } try { String fileName = System.currentTimeMillis() + ".jpg"; String storePath = Environment.getExternalStorageDirectory().getAbsolutePath(); File appDir = new File(storePath); if (!appDir.exists()) { appDir.mkdir(); } File file = new File(appDir, fileName); FileOutputStream fileOutputStream = new FileOutputStream(file); boolean isSuccess = resultImage.compress(Bitmap.CompressFormat.JPEG, 70, fileOutputStream); fileOutputStream.flush(); fileOutputStream.close(); Uri uri = Uri.fromFile(file); GenerateCodeActivity.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri)); if (isSuccess) { Toast.makeText(GenerateCodeActivity.this, "Barcode has been saved locally", Toast.LENGTH_LONG).show(); } else { Toast.makeText(GenerateCodeActivity.this, "Barcode save failed", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { Toast.makeText(GenerateCodeActivity.this, "Unkown Error", Toast.LENGTH_SHORT).show(); } } 欲了解更多HMS Core统一扫码服务详情,请参阅: https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/service-introduction-0000001050041994?ha_source=hms1 华为开发者联盟官网 获取开发指导文档 参与开发者讨论请到Reddit社区 下载demo和示例代码请到Github 解决集成问题请到Stack Overflow

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册