emGee Software Solutions Custom Database Applications

Share this

Web Technologies

React 16.3: What’s New?

Echo JS - Fri, 05/18/2018 - 11:28
Categories: Web Technologies

PHP-1701-A - Nomad PHP

Planet PHP - Fri, 05/18/2018 - 10:55

August - US
Presented By
Adam Culp
August 23, 2018
20:00 CDT

The post PHP-1701-A appeared first on Nomad PHP.

Categories: Web Technologies

Unicode Patterns

CSS-Tricks - Fri, 05/18/2018 - 07:19

These Unicode patterns by Yuan Chuan are extraordinarily clever. It's a <css-doodle> custom web component that sets up a CSS grid and randomizes what character to drop into a cell and things, like color.

See all their gorgeous work on CodePen and the very cool <css-doodle> website as well.

Direct Link to ArticlePermalink

The post Unicode Patterns appeared first on CSS-Tricks.

Categories: Web Technologies

Custom List Number Styling

CSS-Tricks - Fri, 05/18/2018 - 07:16

How about a classic CSS trick! This isn't even so tricky anymore, since CSS has counter-increment and counter-reset and such that is perfect for this. I just wanted to make sure you knew how it works and had some easy-to-copy examples at the ready.

Let's say all you wanna do is style the dang numbers:

See the Pen Custom List Style 2 by Chris Coyier (@chriscoyier) on CodePen.

Here's an example from the CodePen Challenges pages:

See the Pen Custom List Counters by Chris Coyier (@chriscoyier) on CodePen.

The keyframers made a Pen the other day that used pretty cool styles. Here's a redux:

See the Pen Custom List Style 3 by Chris Coyier (@chriscoyier) on CodePen.

Recipe sites are great places to look for custom list styles, as lists of steps are such a prevelant feature. On Mat Marquis' site, he's got some fun ones. I ripped off his CSS and moved it here:

See the Pen Wilto Counters by Chris Coyier (@chriscoyier) on CodePen.

Make sure to check out the fun little media query change. Lea Verou's food site, of course, has counter-based numbering as well.

Here's an interesting demo from Jonathan Snook that has a "timeline" look and uses custom counters to label each section:

See the Pen Timeline CSS with Counters by Jonathan Snook (@snookca) on CodePen.

More Information

The post Custom List Number Styling appeared first on CSS-Tricks.

Categories: Web Technologies

Cloud Disaster Recovery for MariaDB and MySQL

Planet MySQL - Fri, 05/18/2018 - 05:17

MySQL has a long tradition in geographic replication. Distributing clusters to remote data centers reduces the effects of geographic latency by pushing data closer to the user. It also provides a capability for disaster recovery. Due to the significant cost of duplicating hardware in a separate site, not many companies were able to afford it in the past. Another cost is skilled staff who is able to design, implement and maintain a sophisticated multiple data centers environment.

With the Cloud and DevOps automation revolution, having distributed datacenter has never been more accessible to the masses. Cloud providers are increasing the range of services they offer for a better price.One can build cross-cloud, hybrid environments with data spread all over the world. One can make flexible and scalable DR plans to approach a broad range of disruption scenarios. In some cases, that can just be a backup stored offsite. In other cases, it can be a 1 to 1 copy of a production environment running somewhere else.

Related blog posts  Become a ClusterControl DBA: Safeguarding your Data  How to do Point-in-Time Recovery of MySQL & MariaDB Data using ClusterControl  Zero Downtime Network Migration with MySQL Galera Cluster using Relay Node

In this blog we will take a look at some of these cases, and address common scenarios.

Storing Backups in the Cloud

A DR plan is a general term that describes a process to recover disrupted IT systems and other critical assets an organization uses. Backup is the primary method to achieve this. When a backup is in the same data center as your production servers, you risk that all data may be wiped out in case you lose that data center. To avoid that, you should have the policy to create a copy in another physical location. It's still a good practice to keep a backup on disk to reduce the time needed to restore. In most cases, you will keep your primary backup in the same data center (to minimize restore time), but you should also have a backup that can be used to restore business procedures when primary datacenter is down.

ClusterControl: Upload Backup to the cloud

ClusterControl allows seamless integration between your database environment and the cloud. It provides options for migrating data to the cloud. We offer a full combination of database backups for Amazon Web Services (AWS), Google Cloud Services or Microsoft Azure. Backups can now be executed, scheduled, downloaded and restored directly from your cloud provider of choice. This ability provides increased redundancy, better disaster recovery options, and benefits in both performance and cost savings.

ClusterControl: Managing Cloud Credentials

The first step to set up "data center failure - proof backup" is to provide credentials for your cloud operator. You can choose from multiple vendors here. Let's take a look at the process set up for the most popular cloud operator - AWS.

ClusterControl: adding cloud credentials

All you need is the AWS Key ID and the secret for the region where you want to store your backup. You can get that from AWS console. You can follow a few steps to get it.

  1. Use your AWS account email address and password to sign in to the AWS Management Console as the AWS account root user.
  2. On the IAM Dashboard page, choose your account name in the navigation bar, and then select My Security Credentials.
  3. If you see a warning about accessing the security credentials for your AWS account, choose to Continue to Security Credentials.
  4. Expand the Access keys (access key ID and secret access key) section.
  5. Choose to Create New Access Key. Then choose Download Key File to save the access key ID and secret access key to a file on your computer. After you close the dialog box, you will not be able to retrieve this secret access key again.
ClusterControl: Hybrid cloud backup

When all is set, you can adjust your backup schedule and enable backup to cloud option. To reduce network traffic make sure to enable data compression. It makes backups smaller and minimizes the time needed for upload. Another good practice is to encrypt the backup. ClusterControl creates a key automatically and uses it if you decide to restore it. Advanced backup policies should have different keep times for backups stored on servers in the same datacenter, and the backups stored in another physical location. You should set a more extended retention period for cloud-based backups, and shorter period for backups stored near the production environment, as the probability of restore drops with the backup lifetime.

ClusterControl: backup retention policy Extend your cluster with asynchronous replication

Galera with asynchronous replication can be an excellent solution to build an active DR node in a remote data center. There are a few good reasons to attach an asynchronous slave to a Galera Cluster. Long-running OLAP type queries on a Galera node might slow down a whole cluster. With delay apply option, delayed replication can save you from human errors so all those golden enters will be not immediately applied to your backup node.

ClusterControl: delayed replication

In ClusterControl, extending a Galera node group with asynchronous replication is done in a single page wizard. You need to provide the necessary information about your future or existing slave server. The slave will be set up from an existing backup, or a freshly streamed XtraBackup from the master to the slave.

Load balancers in multi-datacenter

Load balancers are a crucial component in MySQL and MariaDB database high availability. It’s not enough to have a cluster spanning across multiple data centers. You still need your services to access them. A failure of a load balancer that is available in one data center will make your entire environment unreachable.

Web proxies in cluster environment

One of the popular methods to hide the complexity of the database layer from an application is to use a proxy. Proxies act as an entry point to the databases, they track the state of the database nodes and should always direct traffic to only the nodes that are available. ClusterControl makes it easy to deploy and configure several different load balancing technologies for MySQL and MariaDB, including ProxySQL, HAProxy, with a point-and-click graphical interface.

ClusterControl: load balancer HA Related webinar  How to Get Started with Open Source Database Management

It also allows making this component redundant by adding keepalived on top of it. To prevent your load balancers from being a single point of failure, one would set up two identical (one active and one in different DC as standby) HAProxy, ProxySQL or MariaDB Maxscale instances and use Keepalived to run Virtual Router Redundancy Protocol (VRRP) between them. VRRP provides a Virtual IP address to the active load balancer and transfers the Virtual IP to the standby HAProxy in case of failure. It is seamless because the two proxy instances need no shared state.

Of course, there are many things to consider to make your databases immune to data center failures.
Proper planning and automation will make it work! Happy Clustering!

Tags:  MySQL MariaDB cloud disaster recovery
Categories: Web Technologies

How to Persist Global Variables Without Using Option Files in MySQL 8.0

Planet MySQL - Fri, 05/18/2018 - 01:31

A really convenient feature in MySQL 8.0 is the ability to persist the values of global variables across server restarts, without writing them into an options file. This was developed primarily for the benefit of Cloud installations of MySQL, but is very handy for a DBA in on-premise installations too.

To use this feature you need to have the SYSTEM_VARIABLES_ADMIN and PERSIST_RO_VARIABLES_ADMIN privileges.

To demonstrate, we'll increase the value of the max_connections system variable from its default of 151 to 152 and then restart the MySQL server to check that MySQL remembers the new value.

mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 151 | +-----------------+-------+ 1 row in set (#.## sec)

Use SET PERSIST to persist the change that we're about to make:

mysql> SET PERSIST max_connections = 152; Query OK, 0 rows affected (#.## sec)

You can also use the following variant:

mysql> SET @@persist.max_connections = 152; Query OK, 0 rows affected (0.01 sec)

Let's take advantage of another feature in MySQL 8.0: the RESTART SQL command. This enables you to restart the MySQL server without leaving the mysql prompt. You must have the SHUTDOWN privilege to use it:

mysql> RESTART; Query OK, 0 rows affected (#.## sec)

Did the server remember the change? Let's see:

mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 152 | +-----------------+-------+ 1 row in set (#.## sec)

In case you’re wondering how you would keep track of these changes if they’re not being written to an options file, MySQL 8.0 stores the change in a file called mysqld-auto.cnf, which resides in the data directory (typically /var/lib/mysql). This file also tells you who made the change, and when it was made:

# cat /var/lib/mysql/mysqld-auto.cnf { "Version":1, "mysql_server":{ "max_connections":{ "Value":"152", "Metadata":{ "Timestamp":1526635140519175, "User":"root", "Host":"localhost" } } } }

You can also query the Performance Schema for this information.

mysql> SELECT * FROM performance_schema.persisted_variables; +-----------------+----------------+ | VARIABLE_NAME | VARIABLE_VALUE | +-----------------+----------------+ | max_connections | 152 | +-----------------+----------------+ 1 row in set (#.## sec)

Don't edit the mysqld-auto.cnf file or the persisted_variables table directly: let the server handle it. If you want to clear all of the persisted variable settings, execute RESET PERSIST.

Categories: Web Technologies

MariaDB 10.2.15 and MariaDB Connector/J 2.2.4 now available

Planet MySQL - Fri, 05/18/2018 - 01:07

The MariaDB Foundation is pleased to announce the availability of MariaDB 10.2.15, the latest stable release in the MariaDB 10.2 series, and MariaDB Connector/J 2.2.4, the latest stable release in the MariaDB Connector/J 2.2 series. See the release notes and changelogs for details. Download MariaDB 10.2.15 Release Notes Changelog What is MariaDB 10.2? MariaDB APT […]

The post MariaDB 10.2.15 and MariaDB Connector/J 2.2.4 now available appeared first on MariaDB.org.

Categories: Web Technologies

Changes in MySQL 8.0.11 (General Availability)

MySQL Server Blog - Thu, 05/17/2018 - 23:59

The MySQL Development team announced the General Availability of MySQL 8.0 on April 19th, 2018. Here we follow up with references to worklogs that were added in 8.0.11. Note the jump in version number from 8.0.4 (RC2) to 8.0.11 (GA) explained here.…

Categories: Web Technologies

Changes in MySQL 8.0.11 (General Availability)

Planet MySQL - Thu, 05/17/2018 - 23:59

The MySQL Development team announced the General Availability of MySQL 8.0 on April 19th, 2018. Here we follow up with references to worklogs that were added in 8.0.11. Note the jump in version number from 8.0.4 (RC2) to 8.0.11 (GA) explained here.…

Categories: Web Technologies

MariaDB Server 10.2.15 and Connector/J 2.2.4 now available

Planet MySQL - Thu, 05/17/2018 - 22:08
MariaDB Server 10.2.15 and Connector/J 2.2.4 now available dbart Fri, 05/18/2018 - 01:08

The MariaDB project is pleased to announce the immediate availability of MariaDB Server 10.2.15 and MariaDB Connector/J 2.2.4. See the release notes and changelogs for details and visit mariadb.com/downloads to download.

Download MariaDB Server 10.2.15

Release Notes Changelog What is MariaDB 10.2?

Download MariaDB Connector/J 2.2.4

Release Notes Changelog About MariaDB Connector/J

The MariaDB project is pleased to announce the immediate availability of MariaDB Server 10.2.15 and MariaDB Connector/J 2.2.4. See the release notes and changelogs for details.

Login or Register to post comments

Categories: Web Technologies

Building Lego Robots with PHP - Nomad PHP

Planet PHP - Thu, 05/17/2018 - 21:02

August - EU
Presented By
Christopher Pitt
August 23, 2018
20:00 CEST

The post Building Lego Robots with PHP appeared first on Nomad PHP.

Categories: Web Technologies

Build Nodejs APIs Using Serverless

CSS-Tricks - Thu, 05/17/2018 - 13:11

Simona Cotin did a great talk at Microsoft Build about Serverless technologies, called "Build Node APIs Using Serverless." In this talk, she addresses pretty much every major gotcha that you might run into while creating Serverless infrastructure for JavaScript applications. Some of the topics included, but are not limited to:

  • CORS
  • Local Debugging with VS Code
  • Installing npm packages
  • Configuring REST-like URLs
  • Saving environment variables

All in all, it's one of the best talks on Serverless I've seen, and if you're interested in this topic, then I highly suggest giving it a watch.

Direct Link to ArticlePermalink

The post Build Nodejs APIs Using Serverless appeared first on CSS-Tricks.

Categories: Web Technologies

MySQL InnoDB Cluster Sandbox

Planet MySQL - Thu, 05/17/2018 - 08:43
InnoDB Cluster is major revolution for MySQL Replication but it is often hard to test out new technologies without a major investment in time, hardware, and frustration.  But what if there was a quick and easy way to set up a test InnoDB Cluster?

SandboxThe details on how to set up a Sandbox InnoDB Cluster  is detailed at https://dev.mysql.com/doc/refman/8.0/en/mysql-innodb-cluster-sandbox-deployment.html but for those seeking a quick and dirty example please keep reading.

Step 1 - Fire up the MySQL Shell and Crate Sandbox Instances Start the MySQL shell and create a Sandbox instance. In this example we set up a sandbox instance at port 3310.

An InnoDB Cluster needs three nodes for fault tolerance so we need to fire up to more sandbox instances on ports 3311 and 3312.

Step 2 -- Create Cluster Connect to one of the sandbox instances, the server of 3310 in this example. Now we use the shell to create a cluster names mydemo.

Step 3 -- Add Instances to Cluster Now we add the other two sandbox instances to the cluster.

Check Status And with that we can use cluster.status() to see that the sandbox InnoDB cluster is ready to use. We have two read only nodes and one read write node.
Step 4 -- Start MySQL Router Finally we start MySQL Router!

And there is how you set up a test instance of an InnoDB cluster in just a few minutes.

Categories: Web Technologies

How React Reconciliation Works

CSS-Tricks - Thu, 05/17/2018 - 07:00

React is fast! Some of that speed comes from updating only the parts of the DOM that need it. Less for you to worry about and a speed gain to boot. As long as you understand the workings of setState(), you should be good to go. However, it’s also important to familiarize yourself with how this amazing library updates the DOM of your application. Knowing this will be instrumental in your work as a React developer.

The DOM?

The browser builds the DOM by parsing the code you write, it does this before it renders the page. The DOM represents documents in the page as nodes and objects, providing an interface so that programming languages can plug in and manipulate the DOM. The problem with the DOM is that it is not optimized for dynamic UI applications. So, updating the DOM can slow your application when there are a lot of things to be changed; as the browser has to reapply all styles and render new HTML elements. This also happens in situations where nothing changes.

What is Reconciliation?

Reconciliation is the process through which React updates the DOM. When a component's state changes, React has to calculate if it is necessary to update the DOM. It does this by creating a virtual DOM and comparing it with the current DOM. In this context, the virtual DOM will contain the new state of the component.

Let's build a simple component that adds two numbers. The numbers will be entered in an input field.

See the Pen reconciliation Pen by Kingsley Silas Chijioke (@kinsomicrote) on CodePen.

First, we'll need to set up the initial state for the fields, then update the state when a number is entered. The component will look like this:

class App extends React.Component { state = { result: '', entry1: '', entry2: '' } handleEntry1 = (event) => { this.setState({entry1: event.target.value}) } handleEntry2 = (event) => { this.setState({entry2: event.target.value}) } handleAddition = (event) => { const firstInt = parseInt(this.state.entry1) const secondInt = parseInt(this.state.entry2) this.setState({result: firstInt + secondInt }) } render() { const { entry1, entry2, result } = this.state return( <div> <div> <p>Entry 1: { entry1 }</p> <p>Entry 2: { entry2 }</p> <p>Result: { result }</p> </div> <br /> <div> Entry 1: <input type='text' onChange={this.handleEntry1} /> </div> <br /> <div> Entry 2: <input type='text' onChange={this.handleEntry2} /> </div> <div> <button onClick={this.handleAddition} type='submit'>Add</button> </div> </div> ) } }

On initial render, the DOM tree will look like this;

When an entry is made in the first input field, React creates a new tree. The new tree which is the virtual DOM will contain the new state for entry1. Then, React compares the virtual DOM with the old DOM and, from the comparison, it figures out the difference between both DOMs and makes an update to only the part that is different. A new tree is created each time the state of App component changes — when a value is entered in either of the inputs field, or when the button is clicked.

Diffing Different Elements

When the state of a component changes so that an element needs to be changed from one type to another, React unmounts the whole tree and builds a new one from scratch. This causes every node in that tree to be destroyed.

Let's see an example:

class App extends React.Component { state = { change: true } handleChange = (event) => { this.setState({change: !this.state.change}) } render() { const { change } = this.state return( <div> <div> <button onClick={this.handleChange}>Change</button> </div> { change ? <div> This is div cause it's true <h2>This is a h2 element in the div</h2> </div> : <p> This is a p element cause it's false <br /> This is another paragraph in the false paragraph </p> } </div> ) } }

On initial render, you will see the div and its contents and how clicking the button causes React to destroy the div's tree with its content and build a tree for the <p> element instead. Same happens if we have the same component in both cases. The component will be destroyed alongside the previous tree it belonged to, and a new instance will be built. See the demo below;

See the Pen reconciliation-2 Pen by Kingsley Silas Chijioke (@kinsomicrote) on CodePen.

Diffing Lists

React uses keys to keep track of items in a list. The keys help it figure out the position of the item on a list. What happens when a list does not have keys? React will mutate every child of the list even if there are no new changes.

In other words, React changes every item in a list that does not have keys.

Here's an example:

const firstArr = ['codepen', 'codesandbox'] const secondArr = ['github', 'codepen', 'bitbucket', 'codesanbox'] class App extends React.Component { state = { change: true } handleChange = (event) => { this.setState({change: !this.state.change}) } render() { const { change } = this.state return( <div> <div> <button onClick={this.handleChange}>Change</button> </div> <ul> { change ? firstArr.map((e) => <li>{e}</li>) : secondArr.map((e) => <li>{e}</li>) } </ul> </div> ) } }

Here, we have two arrays that get rendered depending on the state of the component. React has no way of keep track of the items on the list, so it is bound to change the whole list each time there is a need to re-render. This results in performance issues.

In your console, you will see a warning like this:

Warning: Each child in an array or iterator should have a unique "key" prop.

To fix this, you add a unique key for each item on the list.

const firstArr = ['codepen', 'codesandbox'] const secondArr = ['github', 'codepen', 'bitbucket', 'codesanbox'] class App extends React.Component { state = { change: true } handleChange = (event) => { this.setState({change: !this.state.change}) } render() { const { change } = this.state return( <div> <div> <button onClick={this.handleChange}>Change</button> </div> <ul> { change ? firstArr.map((e, index) => <li key={e.index}>{e}</li>) : secondArr.map((e, index) => <li key={e.index}>{e}</li>) } </ul> </div> ) } }

See the Pen reconciliation-3 Pen by Kingsley Silas Chijioke (@kinsomicrote) on CodePen.

Wrapping Up

In summary, here are the two big takeaways for understanding how the concept of reconciliation works in React:

  • React can make your UI fast, but it needs your help. It’s good to understand its reconciliation process.
  • React doesn't do a full rerender of your DOM nodes. It only changes what it needs to. The diffing process is so fast that you might not notice it.

The post How React Reconciliation Works appeared first on CSS-Tricks.

Categories: Web Technologies

The Ultimate Guide to Headless CMS

CSS-Tricks - Thu, 05/17/2018 - 06:58

(This is a sponsored post.)

The World Has Changed—So Must the CMS

Having a responsive website is no longer enough. Your audience expects a seamless and personalized customer experience across all their devices—the age of headless technology is coming.

Headless CMS is the next generation in content management for brands that want to stay ahead of the curve by engaging customers through the growing number of channels.

Download The Ultimate Guide to Headless CMS ebook for a deep look into what headless CMS is, and why it should be at the top of your list when choosing a new CMS.

Download the ebook now!

Direct Link to ArticlePermalink

The post The Ultimate Guide to Headless CMS appeared first on CSS-Tricks.

Categories: Web Technologies

How Monyog Helps Profile Slow Queries in MariaDB

Planet MySQL - Thu, 05/17/2018 - 05:13

MariaDB came into being the day that Oracle announced the purchase of Sun in 2010.  In order to keep it free under the GNU GPL, Michael Widenius forked MySQL and took several MySQL developers with him in the process.  Since then, MariaDB has been a drop-in replacement for MySQL, albeit with more features and better performance.

In the Improve MariaDB Performance using Query Profiling blog, we learned some useful techniques for tracking and analyzing slow queries using a couple of MariaDB server’s built-in tools: the Slow Query Log and the Performance Schema.  

The Slow Query Log records queries that are deemed to be slow and potentially problematic, that is, queries that take longer than the long_query_time global system variable value to run.

The Performance Schema is a storage engine that contains a database called performance_schema, which in turn consists of a number of tables.  It may be utilized to view raw data in the summary views as well as review performance over time.

Both of the above tools come with their own pros and cons.  For example, the slow query log is easy to work with and may be viewed with any text editor.  The Performance Schema tables may be queried with regular SQL statements for a wide range of performance information.  At the same time, both tools tend to produce a wealth of data that can be a burden to wade through.

That’s where a professional monitoring tool add tremendous value.

More than a Real-time monitoring tool, Monyog features RDS OS and file-based log monitoring, including the General Query, Slow Query and Error logs in a single view.  It also lets you view RDS OS metrics like CPU Utilization, RAM usage etc. using the CloudWatch API.

Configuring the Slow Query Log

In MariaDB, as in MySQL, the Slow Query Log is disabled by default.  It must be enabled by setting the slow_query_log global system variable to 1.  There are a few other system variables for:

  1. Setting the time in seconds/microseconds that define a slow query.
  2. Writing to a file or table.
  3. Providing the name of the slow query log file.
  4. Logging queries that don’t use indexes.

In Monyog, you can configure all of these settings via the ADVANCED tab of the Server Settings dialog.  It is accessible by clicking:

  1. The Servers icon (#1 in the image below).
  2. The ellipsis on the server summary box (#2 in the image below).
  3. The Edit Server item from the popup (not pictured).
  4. The ADVANCED header (underlined in blue in the image below).
  5. The MySQL Query Log item (highlighted in blue in the image below).

The ADVANCED tab of the MySQL Query Log item contains settings for the General Query, Slow Query and Error logs.

The Server Settings dialog also allows us to apply the Slow Query Log settings to the current server or to all servers with tags same as the current server.

Clicking the SAVE button closes the dialog and persists the Slow Log settings.

Dashboard Metrics

The Dashboard displays a set of charts so that DBAs can easily understand the complete security, availability, and performance picture of all their MySQL servers in one place.  Monyog ships with a default dashboard called “Performance metrics”, but DBAs can create their own set of charts for database and OS specific metrics for one or more servers. These include query performance metrics such as Queries Executed, Statements, and Query Cache Efficiency.

All charts and graphs displayed on the Dashboard can be exported in PDF/JPG/PNG formats. To export a chart, click the download icon and select your preferred file format from the drop-down context menu.

Viewing MySQL Logs Details

The Monyog Monitors page displays a detailed display of server parameters and metrics. Clicking the MySQL Logs item under the MONITOR GROUP header brings up details about the General Query, Slow Query (highlighted with a red box in the image below) and Error logs for monitored servers.  

Slow Query information includes:

  • Slow log – Enabled? (Yes/no)
  • Min. execution time for a query to be considered slow, in seconds
  • No. of slow queries
  • Log queries not using indexes? (Yes/no)

Trend Values Graph

A graph or chart is a visual information graphic representation of tabular numeric data. Graphs are often used to make it easier to understand large quantities of data and the relationship between different parts of the data. Graphs can usually be read more quickly than the raw data that they come from.

One type of chart is called a Trend chart or run chart.  It’s utilized to show trends in data over time. Due to data fluctuations, single point measurements can be misleading.  Displaying data over time increases understanding of the real performance, particularly with regard to an established target or goal.

Clicking on a Trend value graph icon in the No. of slow queries row will display a graph, depicting query performance over time.

Following is an example of a trend chart for the Master server:

The SERVERS legend lists all of the servers from the SQL Logs screen.  Each is assigned its own color for easy identification in the graph. Servers whose trend values do not appear in the graph are “greyed out”.  Clicking a Server toggles its inclusion in the graph, thus saving having to return to the SQL Logs screen to select or deselect it. For example, the above graph was produced by clicking the Trend value graph icon in the Master column of the Monitors table.  Hence, the other three servers are greyed out in the legend.  Clicking any of these Servers will add it to the graph, while clicking the Master server will remove it from the graph.

Hovering the mouse over the graph line will display the details for that point on the graph:

Clicking anywhere outside of the graph dialog closes the dialog.

All charts and graphs displayed by the Monitors can be exported in CSV format. To export a chart select the option from the drop-down context menu.

Displaying Trend Values for a Specific Timeframe

The trend graphs explored above presents the current trend data.  In Monyog Professional, Enterprise and Ultimate editions, you can also select a specific time-frame for which to include in the graph by choosing the History item from the TIMEFRAME dropdown.

This will display an additional dropdown for selecting the timeframe range.  It contains a number of intervals such as “Today”, “Yesterday”, and “Last 2 Days” as well as start and end fields to set a custom range.  Clicking on either custom range fields presents a calendar widget for choosing an exact date and time.

Now, clicking on the ‘Trend Graph’ icon in the No. of slow queries row displays the trends graph.

Along with the graph, the Historical Trend Graph also shows the monitor values for each server in tabular form underneath the graph. You can enable the option Show Only Changed Values to restrict values to those before and after changes.

Displaying Delta Results

The third type of Time Frame, Delta, displays results based on data for the period between the last data collection and the collection before that. This setting can help give you a better idea of the current situation, and how much it differs from the ‘average’ or ‘normal’ situation.

Query Analyzer

In the ‘Query Analyzer’ tab select which of the MySQL servers you want and the type of log (including the Slow Query log) you want to analyze. Next click the Analyze button to begin the analysis.

After a few seconds an analysis result like the following will appear:

The Query Analyzer screen is divided into 2 parts: the top half of the screen contains the Top Queries based on Total Time while the bottom half shows all of the queries using results paging.

Top Queries based on Total Time

This section of the screen displays the top queries, sorted so that the slowest query appears at the top. It includes:

  • The query statement
  • COUNT: how many times the statement appears in the log.
  • TOTAL TIME:  How much time the queries took to execute, in hh:mm:ss:ms format.
  • AVERAGE LATENCY: The average query execution time, in hh:mm:ss:ms format.
  • USER@HOST: The user and host that executed the query.

Each statement is presented as a bar chart at the very top of the query data whereby each query is represented using a unique color.  Each query’s Total Execution Time appears from left-to-right so that the slowest would be displayed at the far left. The bar chart helps to quickly assess how slow each of the slowest queries compares to the slowest.  In the image above, we can see that the slowest query was several magnitudes slower than all of the other slow queries times combined!

Clicking on a row brings up the Query Details.  This includes additional information such as the query’s first and last seen date & times, its Max Time, Rows Sent, and Rows Examined:

This is also true of the Queries section.


The Queries section provides a more complete list of analyzed queries.  In addition to having the ability to navigate through all of the queries via paging, it also features:

  • Filtering:
    Queries can be filtered to narrow down the list to those that you are interested in.  The four filtering options are:
    • Containing
    • Not containing
    • Matching regex
    • Not matching regex

Here is a filter that restricts results to statements that contain the regex “sakila*”:

  • Sorting:
    Rows can be sorted by any column by clicking the header.  An arrow shows sorting order, i.e. ascending, descending.

  • Managing Columns:
    Individual columns may be added and removed from the query list via the Manage Columns dialog:

It’s accessible by clicking the Show/Hide Columns icon next to the Results Navigation controls:

Export as CSV

To the immediate left of the Show/Hide Columns icon, the Export as CSV icon saves the query data to a Comma Separated Values (.csv) file.

CSV files may be read by applications like MS Excel.

Changing the Field Delimiter

The option to define the field delimiter is provided because some localized Windows programs that use the comma (,) as a decimal sign will require a semicolon (;) as field separator. This includes Microsoft Office programs like Excel and Access. On Linux, the situation is less uniform but some localized applications such as OpenOffice Calc (spreadsheet app) requires a semicolon (;) as the field separator.

Users can change the CSV export settings by using General > CSV EXPORT from the Settings screen.

Filter settings

The Query Analyzer offers a few options specific to the Slow Query Log.  These are accessible by clicking the Settings icon (highlighted in red below).

Options include:

  • Filter Users/Filter Hosts:
    A list of users/hosts to include or exclude from the analysis.  Both these options accept the asterisk “*” wildcard character.
  • Include Users executing the queries with Host names:
    If this option is selected it will display both the ‘user’ and ‘host’ of that particular query and it will group the query analyzer table based on ‘user@host’ and ‘query’.
  • Read All:
    Selecting the Read All option causes the Query Analyzer to consider the whole file for analyzing. It won’t consider any particular timeframe but displays all queries within the specified KB, MB or bytes size/chunk as set in the Reading limit from file option. Otherwise, it reads the last specified chunk in KB, MB or bytes set in the Reading limit from file option in the log file.  Note that it is the “smallest” of those two settings that will have effect for the analysis.  
  • Reading limit from file:
    Specifies the number of KB, MB or bytes size/chunk to read from the log file according to the Read All setting.



Both of the Slow Query Log and Performance Schema come with their own pros and cons.  Whereas the slow query log is easy to work with and may be viewed with any text editor, the Performance Schema tables may be queried with regular SQL statements for a wide range of performance information.  At the same time, both tools tend to produce a wealth of data that can be a burden to wade through.

That’s where a professional monitoring tool like Monyog can add tremendous value.  Specifically:

  • The Monyog Monitors page displays a detailed display of server parameters and metrics for the General Query, Slow Query and Error logs for monitored servers.  
    It provides Trend charts that show trends in data over time.  The data timeframe may be current, historical, or a delta.
  • The Query Analyzer screen contains the Top Queries based on Total Time as well as a list of all queries using results paging.

Query profiling is a useful technique for analyzing the overall performance of a database. Employing Monyog to monitor the MariaDB Slow Query Log and the Performance Schema is one of the most efficient ways to do that.

The post How Monyog Helps Profile Slow Queries in MariaDB appeared first on Monyog Blog.

Categories: Web Technologies

Cassandra on Fedora 27

Planet MySQL - Wed, 05/16/2018 - 23:38

The last time that I installed Cassandra was on a version of Fedora 20. So, I new the first thing to check was the installation of Java. You can check the Java installation with two statements on a fresh installation of Fedora 27. You need to check the Java runtime and then the Java Software Development Kit before installing, starting, and using Cassandra.

Installing Prerequisites

You check the Java runtime with this command:

java -version

It should return:

openjdk version "1.8.0_171" OpenJDK Runtime Environment (build 1.8.0_171-b10) OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)

You check the Java Software Development Kit (JSDK) with this command:

javac -version

It should return:

javac 1.8.0_171

After verifying the Java and JSDK installation, you can install the Cassandra packages with the following yum command as the root user or a user with sudoer privileges:

yum install -y *cassandra*

You should see a successful installation log like:

Last metadata expiration check: 2:01:07 ago on Wed 16 May 2018 09:48:04 PM MDT. Dependencies resolved. ================================================================================================ Package Arch Version Repository Size ================================================================================================ Installing: cassandra x86_64 3.11.1-4.fc27 updates 175 k cassandra-java-driver noarch 3.1.4-2.fc27 fedora 1.0 M cassandra-java-driver-extras noarch 3.1.4-2.fc27 fedora 60 k cassandra-java-driver-javadoc noarch 3.1.4-2.fc27 fedora 675 k cassandra-java-driver-mapping noarch 3.1.4-2.fc27 fedora 87 k cassandra-java-driver-parent noarch 3.1.4-2.fc27 fedora 15 k cassandra-java-driver-tests noarch 3.1.4-2.fc27 fedora 21 k cassandra-javadoc x86_64 3.11.1-4.fc27 updates 3.3 M cassandra-parent x86_64 3.11.1-4.fc27 updates 17 k cassandra-server x86_64 3.11.1-4.fc27 updates 179 k python-cassandra-driver-doc x86_64 3.13.0-1.fc27 updates 64 k python2-cassandra-driver x86_64 3.13.0-1.fc27 updates 2.6 M python3-cassandra-driver x86_64 3.13.0-1.fc27 updates 2.8 M Installing dependencies: airline noarch 0.7-6.fc27 fedora 89 k antlr3-java noarch 1:3.5.2-16.fc27 fedora 173 k apache-commons-configuration noarch 1.10-10.fc27 fedora 358 k avalon-framework noarch 4.3-18.fc27 fedora 89 k avalon-logkit noarch 2.1-28.fc27 fedora 85 k bean-validation-api noarch 1.1.0-8.fc27 fedora 61 k caffeine noarch 2.3.5-3.fc27 fedora 724 k cassandra-java-libs x86_64 3.11.1-4.fc27 updates 5.3 M cassandra-python2-cqlshlib x86_64 3.11.1-4.fc27 updates 631 k classmate noarch 1.3.1-3.fc27 fedora 72 k compress-lzf noarch 1.0.3-7.fc27 fedora 86 k concurrentlinkedhashmap-lru noarch 1.4.2-5.fc27 fedora 59 k dain-snappy noarch 0.4-4.fc27 fedora 67 k ecj noarch 1:4.7.1-1.fc27 fedora 2.2 M fastutil noarch 7.0.7-4.fc27 fedora 14 M felix-framework noarch 5.6.0-3.fc27 fedora 672 k findbugs noarch 3.0.1-11.fc27 fedora 4.5 M findbugs-bcel noarch 6.0-0.9.20140707svn1547656.fc27 fedora 572 k fontbox noarch 1.8.13-1.fc26 fedora 228 k fop noarch 2.0-7.fc27 fedora 4.5 M hibernate-validator noarch 5.2.4-3.fc27 fedora 632 k high-scale-lib noarch 1.1.4-9.fc27 fedora 105 k jBCrypt noarch 0.4-5.fc27 fedora 22 k jFormatString noarch 0-0.26.20131227gitf159b88.fc27 fedora 38 k jackson noarch 1.9.11-12.fc27 fedora 1.0 M jamm noarch 0.3.1-5.fc27 fedora 35 k jboss-logging noarch 3.3.0-3.fc27 fedora 73 k jcip-annotations noarch 1-21.20060626.fc27 fedora 13 k jna x86_64 4.4.0-7.fc27 fedora 237 k joda-time noarch 2.9.3-4.tzdata2016c.fc27 fedora 522 k jsr-311 noarch 1.1.1-14.fc27 fedora 50 k log4j-over-slf4j noarch 1.7.25-4.fc27 updates 36 k logback noarch 1.1.7-3.fc27 fedora 3.0 M lz4-java x86_64 1.3.0-8.fc27 fedora 151 k maven-archiver noarch 3.1.1-3.fc27 fedora 38 k maven-common-artifact-filters noarch 3.0.1-3.fc27 fedora 60 k maven-compiler-plugin noarch 3.6.1-3.fc27 fedora 67 k maven-doxia-core noarch 1.7-5.fc27 fedora 166 k maven-doxia-logging-api noarch 1.7-5.fc27 fedora 30 k maven-doxia-module-apt noarch 1.7-5.fc27 fedora 63 k maven-doxia-module-fml noarch 1.7-5.fc27 fedora 51 k maven-doxia-module-fo noarch 1.7-5.fc27 fedora 72 k maven-doxia-module-markdown noarch 1.7-5.fc27 fedora 29 k maven-doxia-module-xdoc noarch 1.7-5.fc27 fedora 50 k maven-doxia-module-xhtml noarch 1.7-5.fc27 fedora 31 k maven-doxia-sink-api noarch 1.7-5.fc27 fedora 25 k maven-doxia-sitetools noarch 1.7.4-4.fc27 fedora 186 k maven-failsafe-plugin noarch 2.19.1-8.fc27 fedora 65 k maven-javadoc-plugin noarch 2.10.4-4.fc27 fedora 222 k maven-plugin-annotations noarch 3.5-3.fc27 fedora 26 k maven-reporting-api noarch 1:3.0-12.fc27 fedora 23 k maven-shared-incremental noarch 1.1-13.fc27 fedora 26 k maven-surefire noarch 2.19.1-8.fc27 fedora 496 k maven-surefire-plugin noarch 2.19.1-8.fc27 fedora 40 k metrics noarch 3.1.2-5.fc27 fedora 109 k metrics-jvm noarch 3.1.2-5.fc27 fedora 45 k metrics-reporter-config noarch 3.2.2-2.fc27 fedora 57 k objectweb-asm3 noarch 3.3.1-15.fc27 fedora 397 k ohc noarch 0.6.1-1.fc27 fedora 147 k parboiled noarch 1.1.6-12.fc27 fedora 281 k pegdown noarch 1.4.2-11.fc27 fedora 85 k plexus-archiver noarch 3.4-3.fc27 fedora 179 k plexus-compiler noarch 2.8.1-5.fc27 fedora 69 k plexus-component-api noarch 1.0-0.23.alpha15.fc27 fedora 31 k plexus-i18n noarch 1.0-0.10.b10.4.fc27 fedora 23 k plexus-interactivity-api noarch 1.0-0.24.alpha6.fc27 fedora 19 k plexus-io noarch 2.7.1-3.fc27 fedora 88 k python-blist x86_64 1.3.6-12.fc27 fedora 66 k python-scales noarch 1.0.5-10.fc27 fedora 68 k python2-futures noarch 3.1.1-2.fc27 fedora 32 k python2-simplejson x86_64 3.10.0-5.fc27 fedora 278 k python3-blist x86_64 1.3.6-12.fc27 fedora 66 k python3-scales noarch 1.0.5-10.fc27 fedora 70 k python3-simplejson x86_64 3.10.0-5.fc27 fedora 278 k sigar x86_64 1.6.5-0.20.git58097d9.fc27 fedora 76 k sigar-java x86_64 1.6.5-0.20.git58097d9.fc27 fedora 391 k snappy-java x86_64 fedora 80 k sonatype-oss-parent noarch 7-13.fc27 fedora 15 k stream-lib noarch 2.6.0-8.fc27 fedora 161 k xmlunit noarch 1.6-6.fc27 fedora 365 k Transaction Summary ================================================================================================ Install 93 Packages Total download size: 56 M Installed size: 172 M Downloading Packages: (1/93): cassandra-java-driver-extras-3.1.4-2.fc27.noarch.rpm 199 kB/s | 60 kB 00:00 (2/93): cassandra-java-driver-mapping-3.1.4-2.fc27.noarch.rpm 531 kB/s | 87 kB 00:00 (3/93): cassandra-java-driver-parent-3.1.4-2.fc27.noarch.rpm 308 kB/s | 15 kB 00:00 (4/93): cassandra-java-driver-tests-3.1.4-2.fc27.noarch.rpm 397 kB/s | 21 kB 00:00 (5/93): metrics-3.1.2-5.fc27.noarch.rpm 1.1 MB/s | 109 kB 00:00 (6/93): cassandra-java-driver-javadoc-3.1.4-2.fc27.noarch.rpm 864 kB/s | 675 kB 00:00 (7/93): cassandra-java-driver-3.1.4-2.fc27.noarch.rpm 1.2 MB/s | 1.0 MB 00:00 (8/93): maven-failsafe-plugin-2.19.1-8.fc27.noarch.rpm 957 kB/s | 65 kB 00:00 (9/93): maven-compiler-plugin-3.6.1-3.fc27.noarch.rpm 369 kB/s | 67 kB 00:00 (10/93): sonatype-oss-parent-7-13.fc27.noarch.rpm 170 kB/s | 15 kB 00:00 (11/93): maven-surefire-plugin-2.19.1-8.fc27.noarch.rpm 309 kB/s | 40 kB 00:00 (12/93): maven-javadoc-plugin-2.10.4-4.fc27.noarch.rpm 1.0 MB/s | 222 kB 00:00 (13/93): maven-shared-incremental-1.1-13.fc27.noarch.rpm 236 kB/s | 26 kB 00:00 (14/93): plexus-compiler-2.8.1-5.fc27.noarch.rpm 760 kB/s | 69 kB 00:00 (15/93): maven-plugin-annotations-3.5-3.fc27.noarch.rpm 287 kB/s | 26 kB 00:00 (16/93): maven-archiver-3.1.1-3.fc27.noarch.rpm 662 kB/s | 38 kB 00:00 (17/93): felix-framework-5.6.0-3.fc27.noarch.rpm 1.8 MB/s | 672 kB 00:00 (18/93): maven-common-artifact-filters-3.0.1-3.fc27.noarch.rpm 656 kB/s | 60 kB 00:00 (19/93): maven-doxia-sink-api-1.7-5.fc27.noarch.rpm 296 kB/s | 25 kB 00:00 (20/93): maven-surefire-2.19.1-8.fc27.noarch.rpm 2.0 MB/s | 496 kB 00:00 (21/93): maven-reporting-api-3.0-12.fc27.noarch.rpm 363 kB/s | 23 kB 00:00 (22/93): maven-doxia-sitetools-1.7.4-4.fc27.noarch.rpm 1.1 MB/s | 186 kB 00:00 (23/93): plexus-archiver-3.4-3.fc27.noarch.rpm 1.2 MB/s | 179 kB 00:00 (24/93): plexus-interactivity-api-1.0-0.24.alpha6.fc27.noarch.r 163 kB/s | 19 kB 00:00 (25/93): maven-doxia-logging-api-1.7-5.fc27.noarch.rpm 273 kB/s | 30 kB 00:00 (26/93): maven-doxia-core-1.7-5.fc27.noarch.rpm 1.8 MB/s | 166 kB 00:00 (27/93): maven-doxia-module-apt-1.7-5.fc27.noarch.rpm 623 kB/s | 63 kB 00:00 (28/93): maven-doxia-module-fml-1.7-5.fc27.noarch.rpm 742 kB/s | 51 kB 00:00 (29/93): maven-doxia-module-fo-1.7-5.fc27.noarch.rpm 770 kB/s | 72 kB 00:00 (30/93): maven-doxia-module-markdown-1.7-5.fc27.noarch.rpm 341 kB/s | 29 kB 00:00 (31/93): maven-doxia-module-xdoc-1.7-5.fc27.noarch.rpm 469 kB/s | 50 kB 00:00 (32/93): maven-doxia-module-xhtml-1.7-5.fc27.noarch.rpm 290 kB/s | 31 kB 00:00 (33/93): plexus-i18n-1.0-0.10.b10.4.fc27.noarch.rpm 161 kB/s | 23 kB 00:00 (34/93): plexus-io-2.7.1-3.fc27.noarch.rpm 899 kB/s | 88 kB 00:00 (35/93): dain-snappy-0.4-4.fc27.noarch.rpm 445 kB/s | 67 kB 00:00 (36/93): plexus-component-api-1.0-0.23.alpha15.fc27.noarch.rpm 322 kB/s | 31 kB 00:00 (37/93): apache-commons-configuration-1.10-10.fc27.noarch.rpm 1.9 MB/s | 358 kB 00:00 (38/93): xmlunit-1.6-6.fc27.noarch.rpm 1.6 MB/s | 365 kB 00:00 (39/93): pegdown-1.4.2-11.fc27.noarch.rpm 1.2 MB/s | 85 kB 00:00 (40/93): avalon-framework-4.3-18.fc27.noarch.rpm 770 kB/s | 89 kB 00:00 (41/93): fontbox-1.8.13-1.fc26.noarch.rpm 1.2 MB/s | 228 kB 00:00 (42/93): parboiled-1.1.6-12.fc27.noarch.rpm 1.6 MB/s | 281 kB 00:00 (43/93): avalon-logkit-2.1-28.fc27.noarch.rpm 1.2 MB/s | 85 kB 00:00 (44/93): fop-2.0-7.fc27.noarch.rpm 4.8 MB/s | 4.5 MB 00:00 (45/93): cassandra-3.11.1-4.fc27.x86_64.rpm 290 kB/s | 175 kB 00:00 (46/93): airline-0.7-6.fc27.noarch.rpm 917 kB/s | 89 kB 00:00 (47/93): antlr3-java-3.5.2-16.fc27.noarch.rpm 1.4 MB/s | 173 kB 00:00 (48/93): caffeine-2.3.5-3.fc27.noarch.rpm 5.6 MB/s | 724 kB 00:00 (49/93): compress-lzf-1.0.3-7.fc27.noarch.rpm 899 kB/s | 86 kB 00:00 (50/93): concurrentlinkedhashmap-lru-1.4.2-5.fc27.noarch.rpm 734 kB/s | 59 kB 00:00 (51/93): cassandra-java-libs-3.11.1-4.fc27.x86_64.rpm 4.2 MB/s | 5.3 MB 00:01 (52/93): cassandra-python2-cqlshlib-3.11.1-4.fc27.x86_64.rpm 708 kB/s | 631 kB 00:00 (53/93): ecj-4.7.1-1.fc27.noarch.rpm 6.8 MB/s | 2.2 MB 00:00 (54/93): jBCrypt-0.4-5.fc27.noarch.rpm 306 kB/s | 22 kB 00:00 (55/93): high-scale-lib-1.1.4-9.fc27.noarch.rpm 437 kB/s | 105 kB 00:00 (56/93): jamm-0.3.1-5.fc27.noarch.rpm 586 kB/s | 35 kB 00:00 (57/93): jackson-1.9.11-12.fc27.noarch.rpm 7.9 MB/s | 1.0 MB 00:00 (58/93): joda-time-2.9.3-4.tzdata2016c.fc27.noarch.rpm 3.6 MB/s | 522 kB 00:00 (59/93): lz4-java-1.3.0-8.fc27.x86_64.rpm 2.1 MB/s | 151 kB 00:00 (60/93): metrics-jvm-3.1.2-5.fc27.noarch.rpm 742 kB/s | 45 kB 00:00 (61/93): logback-1.1.7-3.fc27.noarch.rpm 10 MB/s | 3.0 MB 00:00 (62/93): metrics-reporter-config-3.2.2-2.fc27.noarch.rpm 512 kB/s | 57 kB 00:00 (63/93): ohc-0.6.1-1.fc27.noarch.rpm 1.4 MB/s | 147 kB 00:00 (64/93): snappy-java- 1.2 MB/s | 80 kB 00:00 (65/93): sigar-java-1.6.5-0.20.git58097d9.fc27.x86_64.rpm 3.1 MB/s | 391 kB 00:00 (66/93): stream-lib-2.6.0-8.fc27.noarch.rpm 1.8 MB/s | 161 kB 00:00 (67/93): jsr-311-1.1.1-14.fc27.noarch.rpm 815 kB/s | 50 kB 00:00 (68/93): objectweb-asm3-3.3.1-15.fc27.noarch.rpm 5.3 MB/s | 397 kB 00:00 (69/93): jna-4.4.0-7.fc27.x86_64.rpm 306 kB/s | 237 kB 00:00 (70/93): hibernate-validator-5.2.4-3.fc27.noarch.rpm 6.3 MB/s | 632 kB 00:00 (71/93): findbugs-bcel-6.0-0.9.20140707svn1547656.fc27.noarch.r 7.3 MB/s | 572 kB 00:00 (72/93): jFormatString-0-0.26.20131227gitf159b88.fc27.noarch.rp 805 kB/s | 38 kB 00:00 (73/93): jcip-annotations-1-21.20060626.fc27.noarch.rpm 277 kB/s | 13 kB 00:00 (74/93): findbugs-3.0.1-11.fc27.noarch.rpm 6.7 MB/s | 4.5 MB 00:00 (75/93): bean-validation-api-1.1.0-8.fc27.noarch.rpm 1.2 MB/s | 61 kB 00:00 (76/93): cassandra-server-3.11.1-4.fc27.x86_64.rpm 728 kB/s | 179 kB 00:00 (77/93): classmate-1.3.1-3.fc27.noarch.rpm 1.4 MB/s | 72 kB 00:00 (78/93): jboss-logging-3.3.0-3.fc27.noarch.rpm 1.3 MB/s | 73 kB 00:00 (79/93): sigar-1.6.5-0.20.git58097d9.fc27.x86_64.rpm 1.5 MB/s | 76 kB 00:00 (80/93): cassandra-parent-3.11.1-4.fc27.x86_64.rpm 130 kB/s | 17 kB 00:00 (81/93): python-cassandra-driver-doc-3.13.0-1.fc27.x86_64.rpm 245 kB/s | 64 kB 00:00 (82/93): python2-cassandra-driver-3.13.0-1.fc27.x86_64.rpm 3.3 MB/s | 2.6 MB 00:00 (83/93): python-blist-1.3.6-12.fc27.x86_64.rpm 306 kB/s | 66 kB 00:00 (84/93): cassandra-javadoc-3.11.1-4.fc27.x86_64.rpm 2.1 MB/s | 3.3 MB 00:01 (85/93): python-scales-1.0.5-10.fc27.noarch.rpm 183 kB/s | 68 kB 00:00 (86/93): python2-futures-3.1.1-2.fc27.noarch.rpm 89 kB/s | 32 kB 00:00 (87/93): python2-simplejson-3.10.0-5.fc27.x86_64.rpm 742 kB/s | 278 kB 00:00 (88/93): python3-blist-1.3.6-12.fc27.x86_64.rpm 705 kB/s | 66 kB 00:00 (89/93): python3-scales-1.0.5-10.fc27.noarch.rpm 707 kB/s | 70 kB 00:00 (90/93): python3-simplejson-3.10.0-5.fc27.x86_64.rpm 1.4 MB/s | 278 kB 00:00 (91/93): log4j-over-slf4j-1.7.25-4.fc27.noarch.rpm 148 kB/s | 36 kB 00:00 (92/93): python3-cassandra-driver-3.13.0-1.fc27.x86_64.rpm 2.4 MB/s | 2.8 MB 00:01 (93/93): fastutil-7.0.7-4.fc27.noarch.rpm 2.2 MB/s | 14 MB 00:06 ------------------------------------------------------------------------------------------------ Total 4.4 MB/s | 56 MB 00:12 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : maven-doxia-logging-api-1.7-5.fc27.noarch 1/93 Installing : maven-doxia-sink-api-1.7-5.fc27.noarch 2/93 Installing : metrics-3.1.2-5.fc27.noarch 3/93 Installing : cassandra-java-driver-3.1.4-2.fc27.noarch 4/93 Installing : maven-plugin-annotations-3.5-3.fc27.noarch 5/93 Installing : metrics-jvm-3.1.2-5.fc27.noarch 6/93 Installing : maven-reporting-api-1:3.0-12.fc27.noarch 7/93 Installing : joda-time-2.9.3-4.tzdata2016c.fc27.noarch 8/93 Installing : jna-4.4.0-7.fc27.x86_64 9/93 Installing : maven-common-artifact-filters-3.0.1-3.fc27.noarch 10/93 Installing : maven-surefire-2.19.1-8.fc27.noarch 11/93 Installing : maven-failsafe-plugin-2.19.1-8.fc27.noarch 12/93 Installing : maven-surefire-plugin-2.19.1-8.fc27.noarch 13/93 Installing : ohc-0.6.1-1.fc27.noarch 14/93 Installing : cassandra-java-driver-extras-3.1.4-2.fc27.noarch 15/93 Installing : cassandra-java-driver-mapping-3.1.4-2.fc27.noarch 16/93 Installing : log4j-over-slf4j-1.7.25-4.fc27.noarch 17/93 Installing : python3-simplejson-3.10.0-5.fc27.x86_64 18/93 Installing : python3-scales-1.0.5-10.fc27.noarch 19/93 Installing : python3-blist-1.3.6-12.fc27.x86_64 20/93 Installing : python2-simplejson-3.10.0-5.fc27.x86_64 21/93 Installing : python-scales-1.0.5-10.fc27.noarch 22/93 Installing : python2-futures-3.1.1-2.fc27.noarch 23/93 Installing : python-blist-1.3.6-12.fc27.x86_64 24/93 Installing : python2-cassandra-driver-3.13.0-1.fc27.x86_64 25/93 Installing : cassandra-python2-cqlshlib-3.11.1-4.fc27.x86_64 26/93 Installing : sigar-1.6.5-0.20.git58097d9.fc27.x86_64 27/93 Running scriptlet: sigar-1.6.5-0.20.git58097d9.fc27.x86_64 27/93 Installing : jboss-logging-3.3.0-3.fc27.noarch 28/93 Installing : classmate-1.3.1-3.fc27.noarch 29/93 Installing : bean-validation-api-1.1.0-8.fc27.noarch 30/93 Installing : hibernate-validator-5.2.4-3.fc27.noarch 31/93 Installing : metrics-reporter-config-3.2.2-2.fc27.noarch 32/93 Installing : jcip-annotations-1-21.20060626.fc27.noarch 33/93 Installing : jFormatString-0-0.26.20131227gitf159b88.fc27.noarch 34/93 Installing : findbugs-bcel-6.0-0.9.20140707svn1547656.fc27.noarch 35/93 Installing : findbugs-3.0.1-11.fc27.noarch 36/93 Installing : airline-0.7-6.fc27.noarch 37/93 Installing : fastutil-7.0.7-4.fc27.noarch 38/93 Installing : stream-lib-2.6.0-8.fc27.noarch 39/93 Installing : objectweb-asm3-3.3.1-15.fc27.noarch 40/93 Installing : jsr-311-1.1.1-14.fc27.noarch 41/93 Installing : jackson-1.9.11-12.fc27.noarch 42/93 Installing : snappy-java- 43/93 Installing : sigar-java-1.6.5-0.20.git58097d9.fc27.x86_64 44/93 Installing : lz4-java-1.3.0-8.fc27.x86_64 45/93 Installing : logback-1.1.7-3.fc27.noarch 46/93 Installing : jamm-0.3.1-5.fc27.noarch 47/93 Installing : jBCrypt-0.4-5.fc27.noarch 48/93 Installing : high-scale-lib-1.1.4-9.fc27.noarch 49/93 Installing : ecj-1:4.7.1-1.fc27.noarch 50/93 Installing : concurrentlinkedhashmap-lru-1.4.2-5.fc27.noarch 51/93 Installing : compress-lzf-1.0.3-7.fc27.noarch 52/93 Installing : caffeine-2.3.5-3.fc27.noarch 53/93 Installing : antlr3-java-1:3.5.2-16.fc27.noarch 54/93 Installing : cassandra-java-libs-3.11.1-4.fc27.x86_64 55/93 Installing : avalon-logkit-2.1-28.fc27.noarch 56/93 Installing : avalon-framework-4.3-18.fc27.noarch 57/93 Installing : parboiled-1.1.6-12.fc27.noarch 58/93 Installing : pegdown-1.4.2-11.fc27.noarch 59/93 Installing : fontbox-1.8.13-1.fc26.noarch 60/93 Installing : fop-2.0-7.fc27.noarch 61/93 Installing : apache-commons-configuration-1.10-10.fc27.noarch 62/93 Installing : xmlunit-1.6-6.fc27.noarch 63/93 Installing : maven-doxia-core-1.7-5.fc27.noarch 64/93 Installing : maven-doxia-module-xhtml-1.7-5.fc27.noarch 65/93 Installing : maven-doxia-module-markdown-1.7-5.fc27.noarch 66/93 Installing : maven-doxia-module-apt-1.7-5.fc27.noarch 67/93 Installing : maven-doxia-module-fml-1.7-5.fc27.noarch 68/93 Installing : maven-doxia-module-fo-1.7-5.fc27.noarch 69/93 Installing : maven-doxia-module-xdoc-1.7-5.fc27.noarch 70/93 Installing : plexus-component-api-1.0-0.23.alpha15.fc27.noarch 71/93 Installing : plexus-interactivity-api-1.0-0.24.alpha6.fc27.noarch 72/93 Installing : plexus-io-2.7.1-3.fc27.noarch 73/93 Installing : dain-snappy-0.4-4.fc27.noarch 74/93 Installing : plexus-archiver-3.4-3.fc27.noarch 75/93 Installing : maven-archiver-3.1.1-3.fc27.noarch 76/93 Installing : plexus-i18n-1.0-0.10.b10.4.fc27.noarch 77/93 Installing : maven-doxia-sitetools-1.7.4-4.fc27.noarch 78/93 Installing : maven-javadoc-plugin-2.10.4-4.fc27.noarch 79/93 Installing : plexus-compiler-2.8.1-5.fc27.noarch 80/93 Installing : maven-shared-incremental-1.1-13.fc27.noarch 81/93 Installing : maven-compiler-plugin-3.6.1-3.fc27.noarch 82/93 Installing : felix-framework-5.6.0-3.fc27.noarch 83/93 Installing : sonatype-oss-parent-7-13.fc27.noarch 84/93 Installing : cassandra-java-driver-parent-3.1.4-2.fc27.noarch 85/93 Installing : cassandra-java-driver-tests-3.1.4-2.fc27.noarch 86/93 Installing : cassandra-3.11.1-4.fc27.x86_64 87/93 warning: user cassandra does not exist - using root warning: group cassandra does not exist - using root Running scriptlet: cassandra-server-3.11.1-4.fc27.x86_64 88/93 /var/tmp/rpm-tmp.CAL3sJ: line 3: getrnt: command not found Installing : cassandra-server-3.11.1-4.fc27.x86_64 88/93 Running scriptlet: cassandra-server-3.11.1-4.fc27.x86_64 88/93 Installing : python3-cassandra-driver-3.13.0-1.fc27.x86_64 89/93 Installing : python-cassandra-driver-doc-3.13.0-1.fc27.x86_64 90/93 Installing : cassandra-parent-3.11.1-4.fc27.x86_64 91/93 Installing : cassandra-javadoc-3.11.1-4.fc27.x86_64 92/93 Installing : cassandra-java-driver-javadoc-3.1.4-2.fc27.noarch 93/93 Running scriptlet: cassandra-java-driver-javadoc-3.1.4-2.fc27.noarch 93/93 Running as unit: run-rfbf2f7cbd32a4b7c9ec02dd10f9c5c87.service Verifying : cassandra-java-driver-3.1.4-2.fc27.noarch 1/93 Verifying : cassandra-java-driver-extras-3.1.4-2.fc27.noarch 2/93 Verifying : cassandra-java-driver-javadoc-3.1.4-2.fc27.noarch 3/93 Verifying : cassandra-java-driver-mapping-3.1.4-2.fc27.noarch 4/93 Verifying : cassandra-java-driver-parent-3.1.4-2.fc27.noarch 5/93 Verifying : cassandra-java-driver-tests-3.1.4-2.fc27.noarch 6/93 Verifying : metrics-3.1.2-5.fc27.noarch 7/93 Verifying : maven-compiler-plugin-3.6.1-3.fc27.noarch 8/93 Verifying : maven-failsafe-plugin-2.19.1-8.fc27.noarch 9/93 Verifying : maven-javadoc-plugin-2.10.4-4.fc27.noarch 10/93 Verifying : maven-surefire-plugin-2.19.1-8.fc27.noarch 11/93 Verifying : sonatype-oss-parent-7-13.fc27.noarch 12/93 Verifying : felix-framework-5.6.0-3.fc27.noarch 13/93 Verifying : maven-shared-incremental-1.1-13.fc27.noarch 14/93 Verifying : plexus-compiler-2.8.1-5.fc27.noarch 15/93 Verifying : maven-plugin-annotations-3.5-3.fc27.noarch 16/93 Verifying : maven-surefire-2.19.1-8.fc27.noarch 17/93 Verifying : maven-archiver-3.1.1-3.fc27.noarch 18/93 Verifying : maven-common-artifact-filters-3.0.1-3.fc27.noarch 19/93 Verifying : maven-doxia-sink-api-1.7-5.fc27.noarch 20/93 Verifying : maven-doxia-sitetools-1.7.4-4.fc27.noarch 21/93 Verifying : maven-reporting-api-1:3.0-12.fc27.noarch 22/93 Verifying : plexus-archiver-3.4-3.fc27.noarch 23/93 Verifying : plexus-interactivity-api-1.0-0.24.alpha6.fc27.noarch 24/93 Verifying : maven-doxia-logging-api-1.7-5.fc27.noarch 25/93 Verifying : maven-doxia-core-1.7-5.fc27.noarch 26/93 Verifying : maven-doxia-module-apt-1.7-5.fc27.noarch 27/93 Verifying : maven-doxia-module-fml-1.7-5.fc27.noarch 28/93 Verifying : maven-doxia-module-fo-1.7-5.fc27.noarch 29/93 Verifying : maven-doxia-module-markdown-1.7-5.fc27.noarch 30/93 Verifying : maven-doxia-module-xdoc-1.7-5.fc27.noarch 31/93 Verifying : maven-doxia-module-xhtml-1.7-5.fc27.noarch 32/93 Verifying : plexus-i18n-1.0-0.10.b10.4.fc27.noarch 33/93 Verifying : dain-snappy-0.4-4.fc27.noarch 34/93 Verifying : plexus-io-2.7.1-3.fc27.noarch 35/93 Verifying : plexus-component-api-1.0-0.23.alpha15.fc27.noarch 36/93 Verifying : xmlunit-1.6-6.fc27.noarch 37/93 Verifying : apache-commons-configuration-1.10-10.fc27.noarch 38/93 Verifying : fop-2.0-7.fc27.noarch 39/93 Verifying : pegdown-1.4.2-11.fc27.noarch 40/93 Verifying : avalon-framework-4.3-18.fc27.noarch 41/93 Verifying : fontbox-1.8.13-1.fc26.noarch 42/93 Verifying : parboiled-1.1.6-12.fc27.noarch 43/93 Verifying : avalon-logkit-2.1-28.fc27.noarch 44/93 Verifying : cassandra-3.11.1-4.fc27.x86_64 45/93 Verifying : cassandra-java-libs-3.11.1-4.fc27.x86_64 46/93 Verifying : cassandra-python2-cqlshlib-3.11.1-4.fc27.x86_64 47/93 Verifying : airline-0.7-6.fc27.noarch 48/93 Verifying : antlr3-java-1:3.5.2-16.fc27.noarch 49/93 Verifying : caffeine-2.3.5-3.fc27.noarch 50/93 Verifying : compress-lzf-1.0.3-7.fc27.noarch 51/93 Verifying : concurrentlinkedhashmap-lru-1.4.2-5.fc27.noarch 52/93 Verifying : ecj-1:4.7.1-1.fc27.noarch 53/93 Verifying : high-scale-lib-1.1.4-9.fc27.noarch 54/93 Verifying : jBCrypt-0.4-5.fc27.noarch 55/93 Verifying : jackson-1.9.11-12.fc27.noarch 56/93 Verifying : jamm-0.3.1-5.fc27.noarch 57/93 Verifying : jna-4.4.0-7.fc27.x86_64 58/93 Verifying : joda-time-2.9.3-4.tzdata2016c.fc27.noarch 59/93 Verifying : logback-1.1.7-3.fc27.noarch 60/93 Verifying : lz4-java-1.3.0-8.fc27.x86_64 61/93 Verifying : metrics-jvm-3.1.2-5.fc27.noarch 62/93 Verifying : metrics-reporter-config-3.2.2-2.fc27.noarch 63/93 Verifying : ohc-0.6.1-1.fc27.noarch 64/93 Verifying : sigar-java-1.6.5-0.20.git58097d9.fc27.x86_64 65/93 Verifying : snappy-java- 66/93 Verifying : stream-lib-2.6.0-8.fc27.noarch 67/93 Verifying : findbugs-3.0.1-11.fc27.noarch 68/93 Verifying : jsr-311-1.1.1-14.fc27.noarch 69/93 Verifying : objectweb-asm3-3.3.1-15.fc27.noarch 70/93 Verifying : hibernate-validator-5.2.4-3.fc27.noarch 71/93 Verifying : fastutil-7.0.7-4.fc27.noarch 72/93 Verifying : findbugs-bcel-6.0-0.9.20140707svn1547656.fc27.noarch 73/93 Verifying : jFormatString-0-0.26.20131227gitf159b88.fc27.noarch 74/93 Verifying : jcip-annotations-1-21.20060626.fc27.noarch 75/93 Verifying : cassandra-server-3.11.1-4.fc27.x86_64 76/93 Verifying : bean-validation-api-1.1.0-8.fc27.noarch 77/93 Verifying : classmate-1.3.1-3.fc27.noarch 78/93 Verifying : jboss-logging-3.3.0-3.fc27.noarch 79/93 Verifying : sigar-1.6.5-0.20.git58097d9.fc27.x86_64 80/93 Verifying : cassandra-javadoc-3.11.1-4.fc27.x86_64 81/93 Verifying : cassandra-parent-3.11.1-4.fc27.x86_64 82/93 Verifying : python-cassandra-driver-doc-3.13.0-1.fc27.x86_64 83/93 Verifying : python2-cassandra-driver-3.13.0-1.fc27.x86_64 84/93 Verifying : python-blist-1.3.6-12.fc27.x86_64 85/93 Verifying : python-scales-1.0.5-10.fc27.noarch 86/93 Verifying : python2-futures-3.1.1-2.fc27.noarch 87/93 Verifying : python2-simplejson-3.10.0-5.fc27.x86_64 88/93 Verifying : python3-cassandra-driver-3.13.0-1.fc27.x86_64 89/93 Verifying : python3-blist-1.3.6-12.fc27.x86_64 90/93 Verifying : python3-scales-1.0.5-10.fc27.noarch 91/93 Verifying : python3-simplejson-3.10.0-5.fc27.x86_64 92/93 Verifying : log4j-over-slf4j-1.7.25-4.fc27.noarch 93/93 Installed: cassandra.x86_64 3.11.1-4.fc27 cassandra-java-driver.noarch 3.1.4-2.fc27 cassandra-java-driver-extras.noarch 3.1.4-2.fc27 cassandra-java-driver-javadoc.noarch 3.1.4-2.fc27 cassandra-java-driver-mapping.noarch 3.1.4-2.fc27 cassandra-java-driver-parent.noarch 3.1.4-2.fc27 cassandra-java-driver-tests.noarch 3.1.4-2.fc27 cassandra-javadoc.x86_64 3.11.1-4.fc27 cassandra-parent.x86_64 3.11.1-4.fc27 cassandra-server.x86_64 3.11.1-4.fc27 python-cassandra-driver-doc.x86_64 3.13.0-1.fc27 python2-cassandra-driver.x86_64 3.13.0-1.fc27 python3-cassandra-driver.x86_64 3.13.0-1.fc27 airline.noarch 0.7-6.fc27 antlr3-java.noarch 1:3.5.2-16.fc27 apache-commons-configuration.noarch 1.10-10.fc27 avalon-framework.noarch 4.3-18.fc27 avalon-logkit.noarch 2.1-28.fc27 bean-validation-api.noarch 1.1.0-8.fc27 caffeine.noarch 2.3.5-3.fc27 cassandra-java-libs.x86_64 3.11.1-4.fc27 cassandra-python2-cqlshlib.x86_64 3.11.1-4.fc27 classmate.noarch 1.3.1-3.fc27 compress-lzf.noarch 1.0.3-7.fc27 concurrentlinkedhashmap-lru.noarch 1.4.2-5.fc27 dain-snappy.noarch 0.4-4.fc27 ecj.noarch 1:4.7.1-1.fc27 fastutil.noarch 7.0.7-4.fc27 felix-framework.noarch 5.6.0-3.fc27 findbugs.noarch 3.0.1-11.fc27 findbugs-bcel.noarch 6.0-0.9.20140707svn1547656.fc27 fontbox.noarch 1.8.13-1.fc26 fop.noarch 2.0-7.fc27 hibernate-validator.noarch 5.2.4-3.fc27 high-scale-lib.noarch 1.1.4-9.fc27 jBCrypt.noarch 0.4-5.fc27 jFormatString.noarch 0-0.26.20131227gitf159b88.fc27 jackson.noarch 1.9.11-12.fc27 jamm.noarch 0.3.1-5.fc27 jboss-logging.noarch 3.3.0-3.fc27 jcip-annotations.noarch 1-21.20060626.fc27 jna.x86_64 4.4.0-7.fc27 joda-time.noarch 2.9.3-4.tzdata2016c.fc27 jsr-311.noarch 1.1.1-14.fc27 log4j-over-slf4j.noarch 1.7.25-4.fc27 logback.noarch 1.1.7-3.fc27 lz4-java.x86_64 1.3.0-8.fc27 maven-archiver.noarch 3.1.1-3.fc27 maven-common-artifact-filters.noarch 3.0.1-3.fc27 maven-compiler-plugin.noarch 3.6.1-3.fc27 maven-doxia-core.noarch 1.7-5.fc27 maven-doxia-logging-api.noarch 1.7-5.fc27 maven-doxia-module-apt.noarch 1.7-5.fc27 maven-doxia-module-fml.noarch 1.7-5.fc27 maven-doxia-module-fo.noarch 1.7-5.fc27 maven-doxia-module-markdown.noarch 1.7-5.fc27 maven-doxia-module-xdoc.noarch 1.7-5.fc27 maven-doxia-module-xhtml.noarch 1.7-5.fc27 maven-doxia-sink-api.noarch 1.7-5.fc27 maven-doxia-sitetools.noarch 1.7.4-4.fc27 maven-failsafe-plugin.noarch 2.19.1-8.fc27 maven-javadoc-plugin.noarch 2.10.4-4.fc27 maven-plugin-annotations.noarch 3.5-3.fc27 maven-reporting-api.noarch 1:3.0-12.fc27 maven-shared-incremental.noarch 1.1-13.fc27 maven-surefire.noarch 2.19.1-8.fc27 maven-surefire-plugin.noarch 2.19.1-8.fc27 metrics.noarch 3.1.2-5.fc27 metrics-jvm.noarch 3.1.2-5.fc27 metrics-reporter-config.noarch 3.2.2-2.fc27 objectweb-asm3.noarch 3.3.1-15.fc27 ohc.noarch 0.6.1-1.fc27 parboiled.noarch 1.1.6-12.fc27 pegdown.noarch 1.4.2-11.fc27 plexus-archiver.noarch 3.4-3.fc27 plexus-compiler.noarch 2.8.1-5.fc27 plexus-component-api.noarch 1.0-0.23.alpha15.fc27 plexus-i18n.noarch 1.0-0.10.b10.4.fc27 plexus-interactivity-api.noarch 1.0-0.24.alpha6.fc27 plexus-io.noarch 2.7.1-3.fc27 python-blist.x86_64 1.3.6-12.fc27 python-scales.noarch 1.0.5-10.fc27 python2-futures.noarch 3.1.1-2.fc27 python2-simplejson.x86_64 3.10.0-5.fc27 python3-blist.x86_64 1.3.6-12.fc27 python3-scales.noarch 1.0.5-10.fc27 python3-simplejson.x86_64 3.10.0-5.fc27 sigar.x86_64 1.6.5-0.20.git58097d9.fc27 sigar-java.x86_64 1.6.5-0.20.git58097d9.fc27 snappy-java.x86_64 sonatype-oss-parent.noarch 7-13.fc27 stream-lib.noarch 2.6.0-8.fc27 xmlunit.noarch 1.6-6.fc27 Complete!

Starting Cassandra

After you install Cassandra, you can start it as any sudoer user with the following syntax:

sudo cassandra -R

Using Cassandra

You can connect to the Cassandra server with the cqlsh client software. You use the following syntax:


You should see the Cassandra version information, and then you can type help at the cqlsh> prompt to see the available commands:


Here’s my script that creates Cassandra keyspace, which is more or less a database. You use the USE command to connect to the keyspace or database, like you would in MySQL. You do not have sequences in Cassandra because they’re not a good fit for a distributed architecture. Cassandra does not support a native procedural extension like relational databases. You must create User-defined functions (UDFs) by embedding the logic in Java.

This script does the following:

  • Creates a keyspace
  • Uses the keyspace
  • Conditionally drops tables and functions
  • Creates two tables
  • Inserts data into the two tables
  • Queries data from the tables

I also included a call to a UDF inside a query in two of the examples. One of the queries demonstrates how to return a JSON structure from a query. To simplify things and provide clarification of the scripts behaviors, the details are outlined below.

  • The first segment of the script creates the keyspace, changes the scope to use the keyspace, conditionally drop tables, create tables, and insert values into the tables:

    /* Create a keyspace in Cassandra, which is like a database in MySQL or a schema in Oracle. */ CREATE KEYSPACE IF NOT EXISTS student WITH REPLICATION = { 'class':'SimpleStrategy' ,'replication_factor': 1 } AND DURABLE_WRITES = true; /* Use the keyspace or connect to the database. */ USE student; /* Drop the member table from the student keyspace. */ DROP TABLE IF EXISTS member; /* Create a member table in the student keyspace. */ CREATE TABLE member ( member_number VARCHAR , member_type VARCHAR , credit_card_number VARCHAR , credit_card_type VARCHAR , PRIMARY KEY ( member_number )); /* Conditionally drop the contact table from the student keyspace. */ DROP TABLE IF EXISTS contact; /* Create a contact table in the student keyspace. */ CREATE TABLE contact ( contact_number VARCHAR , contact_type VARCHAR , first_name VARCHAR , middle_name VARCHAR , last_name VARCHAR , member_number VARCHAR , PRIMARY KEY ( contact_number )); /* Insert a row into the member table. */ INSERT INTO member ( member_number, member_type, credit_card_number, credit_card_type ) VALUES ('SFO-12345','GROUP','2222-4444-5555-6666','VISA'); /* Insert a row into the contact table. */ INSERT INTO contact ( contact_number, contact_type, first_name, middle_name, last_name, member_number ) VALUES ('CUS_00001','FAMILY','Barry', NULL,'Allen','SFO-12345'); /* Insert a row into the contact table. */ INSERT INTO contact ( contact_number, contact_type, first_name, middle_name, last_name, member_number ) VALUES ('CUS_00002','FAMILY','Iris', NULL,'West-Allen','SFO-12345'); /* Insert a row into the member table. */ INSERT INTO member ( member_number, member_type, credit_card_number, credit_card_type ) VALUES ('SFO-12346','GROUP','3333-8888-9999-2222','VISA'); /* Insert a row into the contact table. */ INSERT INTO contact ( contact_number, contact_type, first_name, middle_name, last_name, member_number ) VALUES ('CUS_00003','FAMILY','Caitlin','Marie','Snow','SFO-12346');
  • The following queries the member table:

    /* Select all columns from the member table. */ SELECT * FROM member;

    It returns the following:

    member_number | credit_card_number | credit_card_type | member_type ---------------+---------------------+------------------+------------- SFO-12345 | 2222-4444-5555-6666 | VISA | GROUP SFO-12346 | 3333-8888-9999-2222 | VISA | GROUP
  • Create a concatenate User-defined function (UDF) for Cassandra. The first step requires you to edit the cassandra.yaml file, which you find in the /etc/cassandra/default.conf directory. There is a single parameter that you need to edit, and it is the enable_user_defined_functions parameter. By default the parameter is set to false, and you need to enable it to create UDFs.

    After you make the edit, the cassandra.yaml file should look like this:

    # If unset, all GC Pauses greater than gc_log_threshold_in_ms will log at # INFO level # UDFs (user defined functions) are disabled by default. # As of Cassandra 3.0 there is a sandbox in place that should prevent execution of evil code. enable_user_defined_functions: true

    After you make the change, you can create your own UDF. The following UDF formats the first, middle, and last name so there’s only one whitespace between the first and last name when there middle name value is null.

    This type of function must use a CALLED ON NULL INPUT clause in lieu of a RETURNS NULL ON NULL INPUT clause. The latter would force the function to return a null value if any one of the parameters were null.

    /* Drop the concatenate function because a replace disallows changing a RETURNS NULL ON NULL INPUT with a CALLED ON NULL INPUT without raising an "89: InvalidRequest" exception. */ DROP FUNCTION concatenate; /* Create a user-defined function to concatenate names. */ CREATE OR REPLACE FUNCTION concatenate (first_name VARCHAR, middle_name VARCHAR, last_name VARCHAR) CALLED ON NULL INPUT RETURNS VARCHAR LANGUAGE java AS $$ /* Concatenate first and last names when middle name is null, and first, middle, and last names when middle name is not null. */ String name; /* Check for null middle name. */ if (middle_name == null) { name = first_name + " " + last_name; } else { name = first_name + " " + middle_name + " " + last_name; } return name; $$;
  • Query the values from the contact table with the UDF function in the SELECT-list:

    /* Query the contact information. */ SELECT member_number , contact_number , contact_type , concatenate(first_name, middle_name, last_name) AS full_name FROM contact;

    It returns the following:

    member_number | contact_number | contact_type | full_name ---------------+----------------+--------------+-------------------- SFO-12345 | CUS_00001 | FAMILY | Barry Allen SFO-12345 | CUS_00002 | FAMILY | Iris West-Allen SFO-12346 | CUS_00003 | FAMILY | Caitlin Marie Snow
  • Query the values from the contact table with a JSON format:

    /* Query the contact information and return in a JSON format. */ SELECT JSON contact_number , contact_type , concatenate(first_name, middle_name, last_name) AS full_name FROM contact;

    It returns the following:

    [json] ------------------------------------------------------------------------------------------------- {"contact_number": "CUS_00001", "contact_type": "FAMILY", "full_name": "Barry Allen"} {"contact_number": "CUS_00002", "contact_type": "FAMILY", "full_name": "Iris West-Allen"} {"contact_number": "CUS_00003", "contact_type": "FAMILY", "full_name": "Caitlin Marie Snow"}

You can call the script from a relative directory inside cqlsh, like this:

source 'cstudent.cql'

At the end of the day, the concept of adding and removing nodes is attractive. Though, the lack of normal relational mechanics and narrowly supported set of CQL semantics leaves me with open questions. For example, is clustering without a coordinator really valuable enough to settle for eventual, or tunable, consistency with such a narrowly scoped query language?

As always, I hope this helps those looking for a quick how-to on Cassandra.

Categories: Web Technologies

What’s new in Google’s V8 JavaScript engine Version 6.7

InfoWorld JavaScript - Wed, 05/16/2018 - 15:00

A new beta of Google’s V8 JavaScript engine is now available.

To read this article in full, please click here

(Insider Story)
Categories: Web Technologies